Como outros apontaram, analisar a recursão pode ficar muito difícil muito rapidamente. Aqui está outro exemplo disso: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
, é difícil calcular uma resposta e um tempo de execução para elas. Isso ocorre devido a essas funções recursivas mutuamente terem uma "forma difícil".
De qualquer forma, vejamos este exemplo fácil:
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))))
Vamos começar tentando calcular funa(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
O tempo de execução é:
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
Agora vamos escolher outro exemplo um pouco mais complicado:
Inspirado em http://planetmath.org/encyclopedia/MutualRecursion.html , que é uma boa leitura por si só, vejamos: "" "Os números de Fibonacci podem ser interpretados por recursão mútua: F (0) = 1 e G (0 ) = 1, com F (n + 1) = F (n) + G (n) e G (n + 1) = F (n). "" "
Então, qual é o tempo de execução de F? Vamos para o outro lado.
Bem, R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
Agora R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
Não é difícil ver que R (F (m)) = F (m) - por exemplo, o número de chamadas de função necessárias para calcular um número de Fibonacci no índice i é igual ao valor de um número de Fibonacci no índice i. Isso pressupunha que a adição de dois números fosse muito mais rápida que uma chamada de função. Se não fosse esse o caso, isso seria verdade: R (F (1)) = R (F (0)) + 1 + R (G (0)), e a análise disso seria mais complicada, possivelmente sem uma solução fácil de forma fechada.
A forma fechada para a sequência de Fibonacci não é necessariamente fácil de reinventar, sem mencionar alguns exemplos mais complicados.