0

今日初めて、オンラインチュートリアルを通じて再帰関数を学習しようとしていますが、最初の段階で立ち往生しています。私は以下のコードを見つけましたが、それは私に'出力:1'を任意の値に対して提供します。だから、私はそれのより良い説明が必要です:

function factorial($n){
if($n==0){
return 1;
}
return fact($n, 1);
}
function fact($i, $j){
if($i<1){
return 1;}
else {
return fact($i-1, $i*$j);
}
}
echo factorial(5);

もう1つ、returnメソッドの下でどのように説明する必要がありますか。

ファクトを返す($ i-1、$ i * $ j);

2つのパラメータから単一の値を伝達するように機能します。any1 plsssは、私の概念を明確にするために、この問題に関するいくつかのアイデアを教えてくれます。事前にThnx..

4

1 に答える 1

1

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);
于 2012-11-21T12:09:07.273 に答える