Comme d'autres l'ont souligné, l'analyse de la récursivité peut devenir très difficile très rapidement. Voici un autre exemple d'une telle chose: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
il est difficile de calculer une réponse et un temps d'exécution pour ceux-ci. Cela est dû à ces fonctions mutuellement récursives ayant une "forme difficile".
Quoi qu'il en soit, regardons cet exemple simple:
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))))
Commençons par essayer de calculer funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Le temps d'exécution est:
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
Prenons maintenant un autre exemple, un peu plus compliqué:
Inspiré par http://planetmath.org/encyclopedia/MutualRecursion.html , qui est une bonne lecture en soi, regardons: "" "Les nombres de Fibonacci peuvent être interprétés par récurrence mutuelle: F (0) = 1 et G (0 ) = 1, avec F (n + 1) = F (n) + G (n) et G (n + 1) = F (n). "" "
Alors, quel est le temps d'exécution de F? Nous irons dans l'autre sens.
Eh bien, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Maintenant R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Il n'est pas difficile de voir que R (F (m)) = F (m) - par exemple, le nombre d'appels de fonction nécessaires pour calculer un nombre de Fibonacci à l'indice i est égal à la valeur d'un nombre de Fibonacci à l'indice i. Cela supposait que l'addition de deux nombres ensemble était beaucoup plus rapide qu'un appel de fonction. Si ce n'était pas le cas, alors ce serait vrai: R (F (1)) = R (F (0)) + 1 + R (G (0)), et l'analyse de cela aurait été plus compliquée, éventuellement sans solution de forme fermée facile.
La forme fermée de la séquence de Fibonacci n'est pas forcément facile à réinventer, sans parler d'exemples plus compliqués.