[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт вычисление факториала. Помогите разобраться
Alexyas
Добрый день. Сейчас изучаю PHP и на теме "Рекурсия" столкнулся со скриптом вычисления факториала. Никак не могу в него въехать, а если не въеду, то дальше PHP изучать мне бессмысленно. разъясните , пожалуйста, как он работает.
Вот сам код:
<?
function fact($x)
{
if ($x == 1)
return 1;
else
return $x * fact($x - 1);
}
?>

С первой половиной все понятно.Если факториал равен единице, вернуть значение "единица". Непонятно остальное. Допустим, входной параметр функции 5. Тогда последняя строка должна выглядеть так:
return 5 * fact(5 - 1)
Здесь функция нам возвращает значение 20 ( если я правильно понял. 5*4) и вызывает саму себя. Т.е. получаем
return 4 * fact(4 - 1) тут функция вернула значение 12
Но факториал числа 5 равен 120, а 20* 12 уже 240. Т.е, чтобы результат получился верным, нужно, чтобы вместо
return 4 * fact(4 - 1) было return 20 * fact(4 - 1), и далее return 60 fact(3 - 1)? , а затем return 120 fact(2 - 1).
Но каким образом тогда код присваивает переменной $x значения 20,60,120, когда в виде входного параметра мы задали ему значение 5?
Понимаю, вопрос глупый, но я только учусь. заранее спасибо за любые разяъснения и комментарии.
Invis1ble
Цитата (Alexyas @ 14.06.2015 - 12:56)
return 5 * fact(5 - 1)
Здесь функция нам возвращает значение 20 ( если я правильно понял. 5*4) и вызывает саму себя.

нет, сначала вычисляется правая часть, т.е. fact(4), т.е. 24 в конечном итоге

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

sergeiss
Цитата (Alexyas @ 14.06.2015 - 13:56)
function fact($x)
{
if ($x == 1)
return 1;
else
return $x * fact($x - 1);
}

Дабы лучше понять, измени код и посмотри, что будет на выходе. Ты поймешь, что в каком порядке вычисляется:
function fact($x)
{
echo "fact called with $x<br>";
if ($x == 1) {
return 1;
}
else {
$ret = $x * fact($x - 1);
echo "return $ret <br>";
return $ret;
}
}


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Alexyas
Дошло! Большое спасибо, что разжевали.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.