2011-09-17 10 views
1

私はPHPでいくつかの再帰演習をやっていると私は、次の出力に困惑ビットだ:このPHPスニペットはなぜこのように動作しますか?

function calc($numTimes, $i, $total) { 
    if (!$i && !$total) {$i = 1; $total = 1;} 
    if ($i <= $numTimes) { 
     $total = $total*2; 
     $i++; 
     calc($numTimes, $i, $total); 
    } 
    echo $total.'+'.$i.'<br />'; 
} 
calc(5); 

それを実行する前に、私は出力が32 + 6であると考えただろう。しかし、これは私が得るものです:

32+6 
32+6 
16+5 
8+4 
4+3 
2+2 

私はそれを得ることはありません。出力は私が予想していたよりも5行だけ長くなるのではなく、合計を増やすのではなく、それを取り除くのですか?また、私は休憩を追加する場合。エコー後は、32 + 6というように返されます。しかし、return $ totalを使用するようにコードを変更すると、代わりに、エコーの:

function calc($numTimes, $i, $total) { 
    if (!$i && !$total) {$i = 1; $total = 1;} 
    if ($i <= $numTimes) { 
     $total = $total*2; 
     $i++; 
     calc($numTimes, $i, $total); 
    } 
    return $total.'+'.$i.'<br />'; 
} 
$r = calc(5); 
echo $r; 

これは、プリントアウトする内容である:

2+2 

私は少し混乱していると期待して誰かが私がここで何が起こっているのか理解するのに役立ちます。

+0

'$ sum'とは何ですか?あなたは何をしようとしているのですか?あなたのコードが壊れている場合は、どうすればいいのですか? –

答えて

4

あなたは再帰呼び出しで何もしていません。 ライン:

calc($numTimes, $i, $total); 

が値をcalculcateが、それを何もしないかもしれません。戻り値が保存されないことに注意してください。あなたはそれを取得する必要があります:私はあなたが何を意味するかと思います

$res = calc($numTimes, $i, $total); 

をして、$解像度で

を続けるです:

function calc($numTimes, $i = 0, $total = 0) { 
    if (!$i && !$total) {$i = 1; $total = 1;} 
    if ($i <= $numTimes) { 
     $total = $total*2; 
     $i++; 
     return calc($numTimes, $i, $total); 
    } 
    return $total.'+'.$i.'<br />'; 
} 
echo calc(5); 
+0

@ dfsq updated;) – galchen

+0

これは効果があり、興味のある値だけを返します。なぜ、全体が減少し続けているのか、かなり興味があります。デフォルト値の定義に関するヒントをお寄せいただきありがとうございます。 – Freyr

+0

$ totalを呼び出しに送信する場合は、変数は送信せず、変数の値を送信します。 $ totalに行った変更は、外側のスコープには影響しません。再帰呼び出しごとに新しい "$ total"が作成されます – galchen

0

あなたの最初の例では、calc()は条件付き自体の内部と呼ばれていますしたがって、それはループし、多数の結果を出力しています(5回のエコー呼び出し)。

2番目の例では、戻り値がcalc()の結果になるように変数を設定しています。それでもループしていますが、結果は毎回無効になります。だから1つの結果が表示されます(エコーは一度呼び出されます)。

0

最初のif句に$totalの代わりに$sumを使用すると、タイプミスが発生します。

関連する問題