他の人が指摘したように、再帰の分析は非常に速く非常に難しくなる可能性があります。ここではそのようなことのもう一つの例である: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 and 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 これは、2つの数値を加算することが関数呼び出しよりもはるかに高速であると仮定しました。これが当てはまらない場合、これは真になります:R(F(1))= R(F(0))+ 1 + R(G(0))、およびこの分析はより複雑でした。おそらく簡単な閉じたフォームのソリューションなし。
フィボナッチ数列の閉じた形式は、いくつかのより複雑な例を言うまでもなく、必ずしも簡単に再発明することはできません。