2017-12-12 2 views
2
function f2($n, $a) 
{ 
    if ($n == 0) 
     return 0; 
    return $a + f2($n-1, $a); // Changed return a... to return $a... 
} 

echo f2(3,4); 

これは12を出力します。しかし、私が考えていることは次のとおりです。誰でも私はこの行を1行ずつ記述するのを助けることができます:関数と再帰

明らかに、$ nと$ aは値の代わりに使用される変数です。この例では、nは3、aは4です。基本ケースはifステートメントであり、nの間のループのように動作します。したがって、nは3であり、nは0に設定されるため、コードは3回ループします。

戻り値は+ f2(n-1、a)です。明らかにそれは数学が計算されるところですが、どうですか?

4 + f2(2, 4) 
4 + f2(1, 4) 
4 + f2(0, 4) 

が、何がそれは合計12を作るために追加ん??:それはこのようにループ

は、私は思います

ので、イムの提示は、私が正しくない場合は、それを理解していれば、何が実際に起こって、どのように出力されているということです何12

+0

F2 'A +($ N-1、$ a)のエコーみてください。あなたのリターン上記'権利を、何を参照起こる – aynber

+0

確かに、試してみましょう。 –

+0

それはエコー: F2 4 +(3-1、4) 4 + F2(2-1、4) 4 + F2(1-1、4) –

答えて

4

最初の呼び出しがあるf2(3,4)

f2(3,4) 
    | 
    return 4 + f(2,4) 
       | 
      return 4 + f(1,4) 
          | 
         return 4 + f(0, 4) 
             | 
            return 0; // and now unwinding the stack, 0 gets passed to the prev. return called. 
             | 
         return 4 +  0 // 4 gets passed to the prev. return called 
          | 
      return 4 + 4 + 0   // 8 gets passed to the prev. return called. 
       | 
    return 4 + 4 + 4 + 0 // f2(3,4) now returns a value of 12 

上記のコールスタックを見て、と呼ばれる最初のリターンは次のようになります。

あなたがであなたの呼び出しをチェーン

return 4 + 4 + 4 + 0

+は、合計が12になるように、演算子によって次の関数呼び出しで aを連鎖させ、最初に returnのすべての中間値を累積します。私はあなたの「ループの解釈」については以下を追加したいと思います

0

...

ベースケースは、if文であり、それは のn間のループのように動作します。したがって、nは3であり、nは0に設定されるため、コードは3回ループします。

ループがありません。 $ n = 0のときに関数が値0を返すことを示しています。

$ 012を減らしながら、return a + f2($n-1, $a);という行で3回呼び出す関数はどうなりますか?

前述のとおり、$ n = 0で値0が返されたときに呼び出しが停止します。中

ですから、自身3回の結果を呼び出す機能を+最初の関数を呼び出す:

4 + f2(2,4) 
4 + 4 + f2(1,4) 
4 + 4 + 4 + f2(0,4) 
4 + 4 + 4 + 0; // 12 
関連する問題