Khái niệm cơ bản về đệ qui (Recursion)
Đệ qui (Recursion) là gì?
Một số ngôn ngữ lập trình cho phép việc một module hoặc một hàm được gọi tới chính nó. Kỹ thuật này được gọi là Đệ qui (Recursion). Trong đệ qui, một hàm a có thể: gọi trực tiếp chính hàm a này hoặc gọi một hàm b mà trả về lời gọi tới hàm a ban đầu. Hàm a được gọi là hàm đệ qui.
Ví dụ: một hàm gọi chính nó
int function(int value) { if(value < 1) return; function(value - 1); printf("%d ",value); }
Ví dụ: một hàm mà gọi tới hàm khác mà trả về lời gọi tới hàm ban đầu
int function(int value) { if(value < 1) return; function(value - 1); printf("%d ",value); }
Đặc điểm của hàm đệ qui
Một hàm đệ qui có thể tiếp tục diễn ra vô số lần giống như một vòng lặp vô hạn. Để tránh điều này, bạn phải ghi nhớ hai thuộc tính sau của hàm đệ qui:
Điều kiện cơ bản: phải có ít nhất một điều kiện để khi mà gặp điều kiện này thì việc gọi chính hàm đó (gọi đệ qui) sẽ dừng lại.
Tiệm cận: mỗi khi hàm đệ qui được gọi thì nó càng tiệm cận tới điều kiện cơ bản.
Sự triển khai hàm đệ qui
Nhiều ngôn ngữ lập trình triển khai sự đệ qui theo cách thức của các ngăn xếp (stack). Nói chung, mỗi khi một hàm (hàm gọi – caller) gọi hàm khác (hàm được gọi – callee) hoặc gọi chính nó (callee), thì hàm caller truyền điều khiển thực thi tới callee. Tiến trình truyền này cũng có thể bao gồm một số dữ liệu từ caller tới callee.
So sánh đệ qui và vòng lặp
Ai đó có thể nói rằng tại sao lại sử dụng đệ qui trong khi sử dụng vòng lặp cũng có thể làm được các tác vụ tương tự. Lý do đầu tiên là đệ qui làm cho chương trình dễ đọc hơn và với các hệ thống CPU cải tiến ngày nay thì đệ qui là hiệu quả hơn rất nhiều khi so với các vòng lặp.
Độ phức tạp thời gian (Time complexity) của hàm đệ qui
Với vòng lặp, chúng ta lấy số vòng lặp để tính độ phức tạp thời gian. Tương tự với đệ qui, giả sử mọi thứ là hằng số, chúng ta tính thời gian một lời gọi đệ qui được tạo ra. Một lời gọi được tạo ra tới một hàm sẽ là Ο(1), Do đó với n là thời gian một lời gọi đệ qui được tạo ra thì độ phức tạp thời gian hàm đệ qui sẽ là Ο(n).
Độ phức tạp bộ nhớ (Space complexity) của hàm đệ qui
Độ phức tạp bộ nhớ được ước lượng dựa vào lượng bộ nhớ cần thêm cho một module được thực thi. Với vòng lặp, trình biên dịch hầu như không cần thêm bộ nhớ. Trình biên dịch sẽ tự cập nhật giá trị của biến được sử dụng ngay trong vòng lặp. Nhưng với đệ qui, hệ thống cần lưu giữ các bản ghi động mỗi khi một lời gọi đệ qui được tạo. Do đó có thể nói rằng, độ phức tạp bộ nhớ của hàm đệ qui là cao hơn so với vòng lặp.
Theo Tutorialspoint
Bài trước: Cấu trúc dữ liệu Heap
Bài tiếp: Bài toán Tháp Hà Nội (Tower of Hanoi)
Bạn nên đọc
-
Công thức tính diện tích mặt cầu, thể tích khối cầu
-
Công thức tính diện tích hình thoi, chu vi hình thoi
-
Công thức tính diện tích hình thang: thường, vuông, cân
-
Công thức tính diện tích hình bình hành, chu vi hình bình hành
-
Công thức tính chu vi hình tam giác
-
Công thức tính chu vi hình tứ giác, diện tích hình tứ giác
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

- Code NgầuThích · Phản hồi · 4 · 17/08/20
Cũ vẫn chất
-
Cách view source, xem mã nguồn trang web bằng điện thoại, máy tính
Hôm qua 1 -
Tổng hợp phím tắt Đấu Trường Chân Lý
Hôm qua -
Hàm Round, cách dùng hàm làm tròn trong Excel
Hôm qua -
14 trang web tải miễn phí phần mềm an toàn
Hôm qua -
Cách thay đổi thiết lập con chuột trong Windows
Hôm qua -
6 cách đánh số trang trong Excel cực nhanh và dễ
Hôm qua -
Cách khắc phục lỗi bo mạch chủ hiện đèn báo màu đỏ
Hôm qua -
Cách tạo sticker tùy chỉnh trên Telegram
Hôm qua -
Cách tính phần trăm (%) trong Google Sheets
Hôm qua -
Ưu và nhược điểm của Internet
Hôm qua