Рекурсия ПХП

Автор kak2z, 12 февраля 2012, 12:44:32

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

kak2z

Привет всем)) Вот рою ПХП и дошел до рекурсий...

function factory($n)
{
   if(!$n)
   {
      return("Факториал числа $n не существует.");
   }
   else
   {
      if($n <= 1){return 1;}
      return $n * factory($n-1); // здесь происходит повторный вызов функции
   }
}
echo factory(5);  // 120
?> 
     

Есть вот такой код)) Но что это " if(!$n) " что значит !$n ??? Рыл в операторах сравнения
Цитировать
$a == $b   Равно   TRUE если $a равно $b после преобразования типов.
$a === $b   Тождественно равно   TRUE если $a равно $b и имеет тот же тип.
$a != $b   Не равно   TRUE если $a не равно $b после преобразования типов.
$a <> $b   Не равно   TRUE если $a не равно $b после преобразования типов.
$a !== $b   Тождественно не равно   TRUE если $a не равно $b или они разных типов.
$a < $b   Меньше   TRUE если $a строго меньше $b.
$a > $b   Больше   TRUE если $a строго больше $b.
$a <= $b   Меньше или равно   TRUE если $a меньше или равно $b.
$a >= $b   Больше или равно   TRUE если $a больше или равно $b.
ничего похожего не нашел((
Спасибо.
Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

GeorG

Не равно. Т.е., если переменная $n не равна значению... Не TRUE.
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

kak2z

Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

kak2z

#3
Я сломал себе мозг...  больше чем пол часа сидел осмысливал что делают эти несчастные три строчки кода

<?
echo factory(5);  // 120
function factory($n)
{
    if($n <= 1) return 1;
    return $n * factory($n-1); // здесь происходит повторный вызов функции
}
?>

все таки не могу понять как работает код)) если тут return $n * factory($n-1), $n все время уменьшается на 1 и умножается на $n.  А тут     if($n <= 1) return 1; возвращает 1 когда $n достигает 1. То почему мы все таки на экране видим 120

Если нужно что то исправить, обновить, переставить, настроить, сделать форум заново - пишите в ЛС)

0daliska

#4
Как-то так судя по функции
5х((5-1)х((4-1)х((3-1)х((2-1)х1))))
на последнем шаге, когда $n=1,  ($n-1) = 0, т.е становится <1, преобразования прерываются, поскольку срабатывает условие if($n <= 1) return 1;
Уехала отдыхать. Сейчас без интернета до 1 августа. Приеду - выполню все обещания
® For members of Russian community (simplemachines.ru) only

Drakonsa

Цитата: kak2z от 12 февраля 2012, 12:44:32Но что это " if(!$n) " что значит !$n
Выполняется одно из условий
$n === false
$n === 0
$n === ''
$n === null

if($n <= 1) -- перегонит $n в int

digital

Цитата: kak2z от 12 февраля 2012, 12:44:32Есть вот такой код)) Но что это " if(!$n) " что значит !$n
Выполняется неявное преобразование типов. Если оператор требует значения логического типа, то это значение будет приведено из числового к логическому типу. Ненулевые значения приводятся к значению TRUE, 0 - к FALSE. К этим приведённым значениям уже применимы операторы "!", "if" и т.д.