PHP

Не понятная рекурсия

Я передаю число 20, значит (20-1) = 19 и получается 20+19 = 39, тогда почему выводит 211?

<?php

function factor($n){
if($n <= 0) return 1;

else {
return $n + factor($n - 1);
}
}

echo factor(20);
Alexander
Alexander
12 925
Ты пьян. Иди спать
Александр Коновал
Александр Коновал
33 197
Лучший ответ
Alexander Не из-за этого
20 — это слишком большое значение для ручного счёта…

К примеру, возьмём значение 5 и попробуем посчитать всё вручную:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

вызываем из программы:
     factor(5)

начинает работать рекурсия:
     результат 1 вызова функции = 5 + factor(4)

вложенный вызов:
     результат 2 вызова функции = 4 + factor(3)

ещё вложенный вызов:
     результат 3 вызова функции = 3 + factor(2)

снова вложенный вызов:
     результат 4 вызова функции = 2 + factor(1)

дошли до предпоследнего вложенного вызова:
     результат 5 вызова = 1 + factor(0)

ну и последний вложенный:
     результат 6 вызова = 1      — из условия if($n <= 0) return 1

С этого момента начинаем возвращаться из вложений.

предпоследний:
     результат 5 вызова = 1 + factor(0) = 1 + 1 = 2

четвёртый вложенный вызов:
     результат 4 вызова функции = 2 + factor(1) = 2 + 2 = 4

третий:
     результат 3 вызова функции = 3 + factor(2) = 3 + 4 = 7

второй:
     результат 2 вызова функции = 4 + factor(3) = 4 + 7 = 11

первый:
     результат 1 вызова функции = 5 + factor(4) = 5 + 11 = 16

Ну вот и результат вызова из программы:
     factor(5) = 16

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Как-то так работает рекурсия!
Жора Корнев
Жора Корнев
63 018
Эту функцию можно изобразить как
fact(n) = n + fact(n - 1) : n > 0
fact(n) = 1 : n <= 1

Значит, в твоем случае, выходит
fact(20) = 20 + fact(19) = 20 + 19 + fact(18) = 20 + 19 + 18 + ~ + 2 + 1 + fact(1-1) = 20*(20+1)/2 + fact(0) = 210 + 1 = 211

Однако, ты же привел в пример функцию
f(n) = n + (n-1) = 2n-1
Что несколько отличается от того, что приведено в коде

К слову, если ты пытался создать функцию факториала, то там не сложение должно быть, а умножение.
Алексей Мячин
Алексей Мячин
11 157
Alexander как-то сложно