2011-09-17 3 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 вызовов для эха).

В вашем втором примере вы установили переменную как результат возвращаемого значения calc(). Он по-прежнему зацикливается, но результат переопределяется каждый раз. Итак, у вас есть один результат, показывающий (эхо вызывается один раз).

0

У вас просто опечатка, используя $sum вместо $total в первой статье if.

Смежные вопросы