Để hiểu đệ quy, bạn cần hiểu đệ quy...
Lặp lại
trong lập trình — theo nghĩa rộng — tổ chức xử lý dữ liệu, trong đó các hành động được lặp lại nhiều lần mà không dẫn đến các cuộc gọi đến chính chúng (không giống như %BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" title="Recursion" >Đệ quy). Theo nghĩa hẹp — quy trình xử lý dữ liệu tuần hoàn một bước.
Thông thường các thuật toán lặp ở bước hiện tại (lặp) sử dụng kết quả của cùng một thao tác hoặc hành động được tính ở các bước trước đó. Một ví dụ về các phép tính như vậy là phép tính các quan hệ lặp lại.
Một ví dụ đơn giản về giá trị đệ quy là giai thừa:
\(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\)
Phép tính giá trị ở mỗi bước (lặp lại) là
\(N=N \cdot i\) . Khi tính giá trị của
\(N\), chúng tôi lấy giá trị đã được lưu trữ
\(N\).
Giai thừa của một số cũng có thể được mô tả bằng cách sử dụng
công thức truy hồi
:
Bạn có thể nhận thấy rằng mô tả này không gì khác hơn là một hàm đệ quy.
Đây là dòng đầu tiên (
\(n <= 1\)) — đây là trường hợp cơ sở (điều kiện kết thúc của đệ quy) và dòng thứ hai là chuyển tiếp sang bước tiếp theo.
Hàm giai thừa đệ quy sẽ như thế này |
So sánh thuật toán tìm giai thừa theo cách thông thường, không đệ quy |
hàm Giai thừa(n: số nguyên): số nguyên;
bắt đầu
nếu n> 1 thì
Giai thừa := n * Giai thừa(n - 1)
khác
Giai thừa := 1;
kết thúc; |
x := 1;
for i := 2 to n do
x := x * i;
writeln(x); |
Bạn nên hiểu rằng các lệnh gọi hàm liên quan đến một số chi phí bổ sung, do đó phép tính giai thừa không đệ quy sẽ nhanh hơn một chút.
Kết luận:chỗ bạn có thể viết chương trình với thuật toán lặp đơn giản, không đệ quy, thì bạn cần viết không đệ quy. Tuy nhiên, có rất nhiều bài toán mà quá trình tính toán chỉ được thực hiện bằng đệ quy.
Mặt khác, thuật toán đệ quy thường dễ hiểu hơn.