factorial
ここに、再帰関数を呼び出す関数がありますfact
。再帰関数は常に次のように機能します。
あなたがそれを「些細な」議論で呼ぶならば、それはあなたにすぐに答えを与えることができます。あなたのコードでは、それはif($i<1){ return $j; }
(@Sreenathのコメントによると)言っている部分です
引数がより「複雑」な場合、関数は引数を単純化し(つまり$i-1
、あなたの例では、些細なケースで$i<1
あるため、何らかの方法で引数を$i
小さくすると、何らかの方法で引数が簡単になります)、より単純な引数と、場合によっては追加情報を使用して自分自身を呼び出します。 、fact($i-1, $i*$j)
呼び出し元です。
したがって、ここでの再帰関数fact
は次のことを実行して機能します。
fact(i, j) = fact(i-1, i*j)
= fact(i-2, (i-1)*(i*j)) = fact(i-3, (i-2)*(i-1)*i*j)
= ... = fact(1, (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j)
= fact(0, (i-i) * (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j)
= (i-i) * (i-(i-1)) * (i-(i-2)) * ... * (i-1) * i * j # Because 0<1
= i! * j
ここで、階乗だけが必要な場合は、の場合と同じように、2番目の引数としてを呼び出す必要がfact
あり1
ますreturn fact($n, 1);
。
function factorial($n){
if($n==0){ # The trivial case
return 1;
}
# Every other case is "complicated": call a specialized function.
return fact($n, 1);
}
function fact($i, $j){
# Helper function: returns i!*j, doing a recursive calculation.
if($i<1){ # The trivial case
return j; # i!*j for i<1 is just j
}
else { # The "complicated" case:
return fact(
$i-1, # Simplify the argument
$i*$j # Pass my current state down
); # And call myself with the simpler argument and the internal state.
}
}
# Test it: This should return 5!=120
echo factorial(5);