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, я просто не понимаю, почему. Вот что я думаю, хотя:
очевидно, $ n и $ a — это переменные, которые будут заменять значения. так как n равно 3 и а 4 в этом примере. базовый случай — это оператор if, и он действует как петля между n. так как n равно 3, а n равно 0, код повторяется 3 раза.
теперь я не получаю возврат a + f2 (n-1, a). очевидно, здесь вычисляется математика, но как?
это выглядит так, я думаю:
4 + f2(2, 4)
4 + f2(1, 4)
4 + f2(0, 4)
но что это добавляет, чтобы сделать сумму 12 ??
так что я спрашиваю, что если я правильно понимаю, а если нет, что на самом деле происходит и как получается результат 12.
первый звонок 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
return a + call f2
, +
оператор цепочки a
со следующим вызовом функции, который в конце накапливает все ваши промежуточные значения в первом return
называется.
Я хотел бы добавить следующее о вашей «интерпретации цикла» …
базовый случай — это оператор if, и он действует как цикл между
п. так как n равно 3, а n равно 0, код повторяется 3 раза.
Там нет петли там. Он просто заявляет, что функция возвращает значение 0, когда $ n = 0.
Что происходит, так это функция, вызывающая себя 3 раза в строке return a + f2($n-1, $a);
уменьшая $ n.
Как указано выше, вызов останавливается, когда $ n = 0 и возвращается значение 0.
Итак, если вы вызываете функцию сначала + функция, вызывающая себя 3 раза, приводит к:
4 + f2(2,4)
4 + 4 + f2(1,4)
4 + 4 + 4 + f2(0,4)
4 + 4 + 4 + 0; // 12