Tại sao phiên bản lặp lại mất nhiều thời gian hơn?


11

Tôi đã xem qua http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ và tôi thấy rằng khi anh ta thực hiện các triển khai đệ quy và lặp lại của hàm giai thừa, việc lặp lại thực sự mất nhiều thời gian hơn cho n = 1.000. Tôi không thể hiểu tại sao (anh ấy không giải thích, nhưng nói rằng đó là một bài tập cho người đọc). Xin lỗi vì sự mới mẻ của tôi cho tất cả những điều này.

Câu trả lời:


10

Hai chương trình không tương đương. Phiên bản đệ quy là điện toán

(... ((1 * 2) * 3) * 4 ... * n)

trong khi cái lặp là tính toán

(... ((N * (n-1)) * (n-2) ... * 1)

do đó, số lượng trung gian đang tăng nhanh hơn cho phiên bản lặp và tính toán số lớn nhanh hơn khi các số liên quan nhỏ (Tính toán 1000! không có chữ số lớn không có ý nghĩa và tự động chuyển đổi phương ngữ sang chữ số lớn).


1

Khi bạn thực hiện một thuật toán đệ quy lặp lại, bạn phải thực hiện rõ ràng ngăn xếp theo dõi kết quả. Đạo luật này bổ sung thêm các hoạt động xử lý việc đẩy và bật ngăn xếp mà thuật toán đệ quy được miễn phí (cũng không hoàn toàn miễn phí nhưng các hoạt động bổ sung cộng lại nhiều hơn chi phí đệ quy).


1
Bạn đã xem các chương trình? Giai thừa lặp không thao túng một ngăn xếp nào cả.
AProgrammer

-1

Tôi chỉ có thể đoán, tôi thậm chí không chắc những điểm chuẩn đó là từ C hay từ mã SBLC. Tôi đoán là thủ phạm đang biến đổi biến. 1000! là một con số khá lớn, có thể nhanh hơn để tạo ra ngăn xếp với các phần xen kẽ và dọn dẹp hơn là tạo một bản sao và ghi đè.


Đó là từ mã SBCL, tôi nghĩ vậy.
martinjacobd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.