Come altri hanno sottolineato, analizzare la ricorsione può diventare molto difficile molto velocemente. Ecco un altro esempio di questa cosa: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
è difficile calcolare una risposta e un tempo di esecuzione per questi. Ciò è dovuto al fatto che queste funzioni reciprocamente ricorsive hanno una "forma difficile".
Comunque, diamo un'occhiata a questo semplice esempio:
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))))
Iniziamo provando a calcolare funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
Il tempo di esecuzione è:
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
Ora scegliamo un altro esempio leggermente più complicato:
Ispirato da http://planetmath.org/encyclopedia/MutualRecursion.html , che è una buona lettura da solo, diamo un'occhiata a: "" "I numeri di Fibonacci possono essere interpretati tramite ricorsione reciproca: F (0) = 1 e G (0 ) = 1, con F (n + 1) = F (n) + G (n) e G (n + 1) = F (n). "" "
Quindi, qual è il tempo di esecuzione di F? Andremo dall'altra parte.
Bene, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Ora R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Non è difficile vedere che R (F (m)) = F (m) - ad es. Il numero di chiamate di funzione necessarie per calcolare un numero di Fibonacci all'indice i è uguale al valore di un numero di Fibonacci all'indice i. Ciò presupponeva che l'aggiunta di due numeri insieme fosse molto più veloce di una chiamata di funzione. Se così non fosse, allora sarebbe vero: R (F (1)) = R (F (0)) + 1 + R (G (0)), e l'analisi di questo sarebbe stata più complicata, possibilmente senza una soluzione di forma chiusa facile.
La forma chiusa per la sequenza di Fibonacci non è necessariamente facile da reinventare, per non parlare di alcuni esempi più complicati.