다른 사람들이 지적했듯이 재귀 분석은 매우 빠릅니다. : 여기에 같은 것은 또 다른 예입니다 http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
는 답변 이들에 대한 실행 시간을 계산하기 어렵다은. 이것은 "복잡한 형태"를 갖는 이러한 상호 재귀 함수 때문이다.
어쨌든,이 쉬운 예를 보자 :
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에서 피보나치 수를 계산하는 데 필요한 함수 호출 수는 피보나치 수 값과 같습니다. 색인에서 i. 이것은 두 개의 숫자를 더하는 것이 함수 호출보다 훨씬 빠르다고 가정했습니다. 그렇지 않은 경우, 이는 사실입니다 : R (F (1)) = R (F (0)) + 1 + R (G (0)) 그리고 이것에 대한 분석은 더 복잡했을 것입니다. 쉬운 폐쇄 형 솔루션이 없을 수도 있습니다.
피보나치 수열의 닫힌 형태는 좀 더 복잡한 예는 말할 것도없이 재창조하기 쉽지는 않습니다.