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 thể tích khối tròn xoay và ví dụ minh họa
-
Công thức tính diện tích hình chóp
-
Công thức tính chiều cao hình thang: thường, vuông, cân
-
Công thức tính chu vi hình tam giác
-
Công thức tính diện tích hình lập phương, thể tích khối lập phương
-
Công thức tính Diện tích hình vuông, tính Chu vi hình vuông
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
-

Hướng dẫn toàn tập Word 2016 (Phần 28): Cách trộn văn bản, trộn thư Mail Merge
2 ngày -

Full giftcode Big Bang Thời Không mới nhất và cách đổi code lấy thưởng
2 ngày -

Căn chỉnh - Align trong CSS
2 ngày -

1 tấn bằng bao nhiêu tạ, yến, kg
2 ngày 34 -

Những bài thơ về tiền hay và sâu sắc khiến bạn phải suy ngẫm
2 ngày -

6 điều tệ hại sẽ xảy ra nếu bạn thường xuyên bỏ bữa
2 ngày -

Câu nói hay về phụ nữ, danh ngôn hay về người phụ nữ hiện đại, mạnh mẽ
2 ngày -

Hàm map() trong Python
2 ngày 2 -

Làm việc với File trong Python
2 ngày -

Xoay sở hay xoay xở mới đúng chính tả? Có đến 90% người dùng bị sai
2 ngày
Học IT
Microsoft Word 2013
Microsoft Word 2007
Microsoft Excel 2019
Microsoft Excel 2016
Microsoft PowerPoint 2019
Google Sheets
Lập trình Scratch
Bootstrap
Hướng dẫn
Ô tô, Xe máy