Я передаю число 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);
PHP
Не понятная рекурсия
Ты пьян. Иди спать
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Как-то так работает рекурсия!
К примеру, возьмём значение 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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Как-то так работает рекурсия!
Эту функцию можно изобразить как
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
Что несколько отличается от того, что приведено в коде
К слову, если ты пытался создать функцию факториала, то там не сложение должно быть, а умножение.
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
Что несколько отличается от того, что приведено в коде
К слову, если ты пытался создать функцию факториала, то там не сложение должно быть, а умножение.
Alexander
как-то сложно
Похожие вопросы
- Стоит ли использовать рекурсию в целом? (+)
- Рекурсия, Последний шаг, Разрыв цепочки рекурсии
- Что такое рекурсия? (общее определение)
- Рекурсия, возникли проблемы с изучением рекурсии, не могли бы подсказать книги или видео про обьяснение рекурсии
- Скажите, что такое РЕКУРСИЯ? (только понятным языком---тяжко мне просторы интернета бороздить в поисках ответа)
- Ошибка в программе delphi. Рекурсия
- Вопрос тем, кто хорошо знаком с рекурсией. Язык Си (но это второстепенно)...
- Подскажите практическую задачку на углубленное понимание что такое рекурсия?
- Сравнить 2 массива через рекурсию
- Задачка на Delphi, рекурсия...