再帰の終了条件がないため、再帰は永久に実行されます。
再帰をよく理解していないように思われるので、もう少し単純なフィボナッチ数列から始めたいと思います。
再帰の観点から関数を定義するときはいつでも、最初にベースケースを定義する必要があります。フィボナッチの場合、2つの基本ケースがあります。
F(0) = 0
F(1) = 1
つまり、英語では、「0のFは0、1のFは1」です。または、さらに簡単に言えば、関数Fに0を渡すと、0が返されます。1を渡すと、1が返されます。
基本ケースを定義したら、漸化式を探す必要があります。フィボナッチの場合、次のような再発があります。
F(n)= F(n-1)+ F(n-2)
したがってn >= 2
、については、上記の繰り返しを使用できます。なんで?さて、n=2で試してみましょう。
F(2) = F(n-1) + F(n-2)
= F(1) + F(0)
= 1 + 0
= 1
これで、F(2)の答えが1であることがわかりました。さらに、F(3)の答えを計算できます。なんで?さて、F(3)を計算するために何が必要ですか?F(2)とF(1)が必要です。F(1)が基本ケースであるため、これらの両方の答えが得られ、上記のF(2)を解きました。
それでは、Fを解くための擬似コードを書いてみましょう。
function F(int n) {
// handle base cases
if (n equals 0)
return 0
if (n equals 1)
return 1
// recurrence
return F(n-1) + F(n-2);
}
再帰関数では、関数の最初で常に基本ケースを処理することに注意してください。基本ケースが設定されていない場合、この再発を定義することはできません。そうでない場合、再発の終了条件はありません。そのため、常に関数の先頭にベースケースを配置します。
さて、上記の説明を考えると、別の良い練習は階乗関数の再帰関数を書くことです。したがって、次の手順に従います。
1. Define the base case (use wikipedia article for hints).
2. Define recurrence in terms of base case
3. Write pseudo code to solve the recurrence, and be sure to put base case(s) at beginning of function, and recurrence at end.
これらの手順を理解したら、電源の繰り返しに進む方がはるかに理にかなっているはずです。