Як зазначали інші, аналіз рекурсії може отримати дуже важкий результат дуже швидко. Ось ще один приклад такої речі: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_F
Female_and_Male_ наслідки важко обчислити відповідь та час їх виконання. Це пов’язано з цими взаємно-рекурсивними функціями, що мають "складну форму".
Як би то не було, давайте розглянемо цей простий приклад:
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))))
Почнемо з спроби обчислити funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Час виконання:
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
Тепер виберемо ще один, трохи складніший приклад:
Натхненний http://planetmath.org/encyclopedia/MutualRecursion.html , який добре читається сам по собі, давайте подивимось на: "" "Числа Фібоначчі можна інтерпретувати за допомогою взаємної рекурсії: F (0) = 1 і G (0 ) = 1, при F (n + 1) = F (n) + G (n) і G (n + 1) = F (n). ""
Отже, який час виконання F? Ми підемо іншим шляхом.
Ну, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Тепер R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Не важко зрозуміти, що R (F (m)) = F (m) - наприклад, кількість викликів функції, необхідних для обчислення числа Фібоначчі в індексі i, дорівнює значенню числа Фібоначчі за індексом i. Це передбачало, що додавання двох чисел разом набагато швидше, ніж виклик функції. Якби це не було, то це було б правдою: R (F (1)) = R (F (0)) + 1 + R (G (0)), і аналіз цього був би складнішим, можливо, без легкого рішення закритої форми.
Закриту форму послідовності Фібоначчі не обов'язково легко винаходити, не кажучи вже про деякі складніші приклади.