Wie andere betonten, kann die Analyse der Rekursion sehr schnell sehr schwierig werden. Hier ist ein weiteres Beispiel dafür: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
Es ist schwierig, eine Antwort und eine Laufzeit für diese zu berechnen. Dies liegt daran, dass diese gegenseitig rekursiven Funktionen eine "schwierige Form" haben.
Wie auch immer, schauen wir uns dieses einfache Beispiel an:
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))))
Beginnen wir mit dem Versuch, Folgendes zu berechnen funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Die Laufzeit beträgt:
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
Lassen Sie uns nun ein anderes, etwas komplizierteres Beispiel auswählen:
Inspiriert von http://planetmath.org/encyclopedia/MutualRecursion.html , was für sich genommen eine gute Lektüre ist, betrachten wir: "" Fibonacci-Zahlen können durch gegenseitige Rekursion interpretiert werden: F (0) = 1 und G (0) ) = 1 mit F (n + 1) = F (n) + G (n) und G (n + 1) = F (n).
Was ist die Laufzeit von F? Wir werden den anderen Weg gehen.
Nun, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Jetzt ist R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Es ist nicht schwer zu erkennen, dass R (F (m)) = F (m) - z. B. ist die Anzahl der Funktionsaufrufe, die zum Berechnen einer Fibonacci-Zahl am Index i erforderlich sind, gleich dem Wert einer Fibonacci-Zahl am Index i. Dies setzt voraus, dass das Addieren von zwei Zahlen viel schneller ist als ein Funktionsaufruf. Wenn dies nicht der Fall wäre, dann wäre dies wahr: R (F (1)) = R (F (0)) + 1 + R (G (0)), und die Analyse davon wäre komplizierter gewesen, möglicherweise ohne eine einfache geschlossene Formlösung.
Die geschlossene Form der Fibonacci-Sequenz ist nicht unbedingt leicht neu zu erfinden, ganz zu schweigen von einigen komplizierteren Beispielen.