Như những người khác đã chỉ ra, phân tích đệ quy có thể rất khó rất nhanh. Dưới đây là một ví dụ khác về điều đó: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_fterence#Hofstadter_Fbang_and_Male_fterences
thật khó để tính toán một câu trả lời và thời gian chạy cho những điều này. Điều này là do các hàm đệ quy lẫn nhau này có "dạng khó".
Dù sao đi nữa, hãy xem ví dụ dễ hiểu này:
http://pramode.net/clojure/2010/05/08/clojure-trampoline/
(declare funa funb)
(defn funa [n]
(if (= n 0)
0
(funb (dec n))))
(defn funb [n]
(if (= n 0)
0
(funa (dec n))))
Hãy bắt đầu bằng cách tính toán funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Thời gian chạy là:
R(funa(m)) = 1 + R(funb(m - 1)) = 2 + R(funa(m - 2)) = ... m + R(funa(0)) or m + R(funb(0)) = m + 1 steps either way
Bây giờ hãy chọn một ví dụ khác, phức tạp hơn một chút:
Lấy cảm hứng từ http://planetmath.org/encyclopedia/MutualRecursion.html , đây là một cách đọc tốt, chúng ta hãy xem: "" "Các số Fibonacci có thể được diễn giải thông qua đệ quy lẫn nhau: F (0) = 1 và G (0 ) = 1, với F (n + 1) = F (n) + G (n) và G (n + 1) = F (n). "" "
Vậy, thời gian chạy của F là gì? Chúng tôi sẽ đi theo con đường khác.
Vâng, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Bây giờ R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Không khó để thấy rằng R (F (m)) = F (m) - ví dụ: số lượng các lệnh gọi hàm cần thiết để tính toán một số Fibonacci tại chỉ số i bằng với giá trị của một số Fibonacci tại chỉ số i. Điều này giả định rằng việc cộng hai số lại với nhau nhanh hơn nhiều so với lệnh gọi hàm. Nếu đây không phải là trường hợp, thì điều này sẽ đúng: R (F (1)) = R (F (0)) + 1 + R (G (0)), và việc phân tích điều này sẽ phức tạp hơn, có thể không có một giải pháp dạng đóng dễ dàng.
Biểu mẫu đóng cho chuỗi Fibonacci không nhất thiết phải dễ dàng phát minh lại, chưa kể một số ví dụ phức tạp hơn.