Seperti yang ditunjukkan orang lain, menganalisis rekursi bisa menjadi sangat sulit dengan sangat cepat. Berikut adalah contoh lain dari hal tersebut: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_afterence#Hofstadter_Female_and_Male_foreences
sulit untuk menghitung jawaban dan waktu berjalan untuk ini. Ini karena fungsi-fungsi yang saling rekursif ini memiliki "bentuk yang sulit".
Bagaimanapun, mari kita lihat contoh mudah ini:
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))))
Mari kita mulai dengan mencoba menghitung funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Run-time adalah:
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
Sekarang mari kita ambil contoh lain yang sedikit lebih rumit:
Terinspirasi oleh http://planetmath.org/encyclopedia/MutualRecursion.html , yang merupakan bacaan yang bagus dengan sendirinya, mari kita lihat: "" "Angka-angka Fibonacci dapat ditafsirkan melalui rekursi bersama: F (0) = 1 dan G (0 ) = 1, dengan F (n + 1) = F (n) + G (n) dan G (n + 1) = F (n). "" "
Jadi, apa runtime dari F? Kami akan pergi ke arah lain.
Nah, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Sekarang R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Tidak sulit untuk melihat bahwa R (F (m)) = F (m) - misalnya jumlah pemanggilan fungsi yang diperlukan untuk menghitung angka Fibonacci pada indeks i sama dengan nilai angka Fibonacci pada indeks i. Ini diasumsikan bahwa menambahkan dua nomor bersama-sama jauh lebih cepat daripada panggilan fungsi. Jika ini tidak terjadi, maka ini benar: R (F (1)) = R (F (0)) + 1 + R (G (0)), dan analisisnya akan lebih rumit, mungkin tanpa solusi bentuk mudah ditutup.
Bentuk tertutup untuk urutan Fibonacci tidak selalu mudah untuk ditemukan kembali, belum lagi beberapa contoh yang lebih rumit.