Diğerlerinin belirttiği gibi, özyinelemeyi analiz etmek çok hızlı bir şekilde zorlaşabilir. İşte böyle bir şeyin başka bir örneği: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
Bir cevap ve çalışma süresi hesaplamak zor. Bunun nedeni, "zor bir forma" sahip olan karşılıklı olarak özyinelemeli işlevlerdir.
Her neyse, bu kolay örneğe bakalım:
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))))
Hesaplamaya çalışarak başlayalım funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Çalışma süresi:
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
Şimdi biraz daha karmaşık bir örnek daha seçelim:
Kendi başına iyi bir okuma olan http://planetmath.org/encyclopedia/MutualRecursion.html'den esinlenerek şunları inceleyelim: "" "Fibonacci sayıları karşılıklı özyineleme ile yorumlanabilir: F (0) = 1 ve G (0) ) = 1, F (n + 1) = F (n) + G (n) ve G (n + 1) = F (n) ile. "" "
Peki, F'nin çalışma süresi nedir? Diğer yoldan gideceğiz.
Şey, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Şimdi R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
R (F (m)) = F (m) - örneğin, i indeksindeki bir Fibonacci numarasını hesaplamak için gereken fonksiyon çağrılarının sayısının bir Fibonacci sayısının değerine eşit olduğunu görmek zor değil i dizininde. Bu, iki sayı birlikte eklemenin bir işlev çağrısından çok daha hızlı olduğu varsayılmıştır. Durum böyle olmasaydı, bu doğru olurdu: R (F (1)) = R (F (0)) + 1 + R (G (0)) ve bunun analizi daha karmaşık olurdu, muhtemelen kolay kapalı bir form çözümü olmadan.
Fibonacci dizisi için kapalı formun yeniden icat edilmesi kolay değildir, daha karmaşık örneklerden bahsetmiyoruz.