Как отмечали другие, анализ рекурсии может быть очень сложным и очень быстрым. Вот еще один пример такой вещи: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequence
сложно вычислить ответ и время выполнения для них. Это связано с тем, что эти взаимно-рекурсивные функции имеют «сложную форму».
В любом случае, давайте посмотрим на этот простой пример:
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, равно значению числа Фибоначчи по индексу я. Предполагалось, что сложение двух чисел намного быстрее, чем вызов функции. Если бы это было не так, то это было бы верно: R (F (1)) = R (F (0)) + 1 + R (G (0)), и анализ этого был бы более сложным, возможно без простого решения в закрытой форме.
Закрытую форму для последовательности Фибоначчи не обязательно легко изобрести заново, не говоря уже о некоторых более сложных примерах.