Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: рекурся и работа конструкции return
Форумы портала PHP.SU » » Вопросы новичков » рекурся и работа конструкции return

Страниц (1): [1]
 

1. dadli - 19 Ноября, 2011 - 20:59:48 - перейти к сообщению
здраствуите.
почему етот код не возврашает число 1, и почему возврашает 24 ?

PHP:
скопировать код в буфер обмена
  1. function factorial($x) {
  2. if ($x == 0)  { return 1; }
  3. else { return   $x * factorial($x-1); }
  4. }
  5. echo factorial(4);


тоест мне запутал работа консреукции return, я так понимаю его работу: функция должен возврашат то, что написано после return, но здес так не происходит (по моему) и возврашается факторял числа 4, обясните пожалуиста почему?
2. Самогонщик - 19 Ноября, 2011 - 21:03:02 - перейти к сообщению
Потому перед тем как вернуть значение оно вычисляется, т.е. вычисляется фрактал для трёх, двух и одного.
3. OrmaJever - 19 Ноября, 2011 - 23:02:04 - перейти к сообщению
Если $x не равно 0 то вычисляется else
PHP:
скопировать код в буфер обмена
  1. return {  $x * factorial($x-1); }

а тут написано (если $x = 4) 4 * 3 * 2 * 1 = 24
4. dadli - 19 Ноября, 2011 - 23:06:42 - перейти к сообщению
но есть момент, так скажем "последний шаг", где $х ровно 0 (нулл), a почему не вернёт функця число 1? в условие же так написано? ето не понимаю Однако
5. Panoptik - 19 Ноября, 2011 - 23:24:03 - перейти к сообщению
оно и вернуло 1, но потом эта единица попала в шаг вычисления когда x=2 потом всё это пошло к 3,4 и на том всё закончилось. рекурсии обычно и выполняются изнутри к внешним значениям и тебе же написали что получилось 4*3*2*1 , тут стоило бы дописать что в оригинале расчет имеет вид 4*3*2*1*1 - где последняя единица и есть возвращенный ретурн от 0
(Добавление)
кстати зачем извращаться с рекурсией, если можно просто подсчитать факториал следующим образом
PHP:
скопировать код в буфер обмена
  1.  
  2. function factorial($x) {
  3.   if($x>0) {
  4.     $f = 1;
  5.     for($i=1;$i<=$x;$i++) {
  6.       $f *= i;
  7.     }
  8.     return $f;
  9.   } else {
  10.     return 1;
  11.   }
  12. }
  13.  
6. dadli - 20 Ноября, 2011 - 00:43:59 - перейти к сообщению
Panoptik
спаисоб балшое хорошие обасненя Улыбка
Цитата:
кстати зачем извращаться с рекурсией


да вичисленя факториала конечно можно по другому но я хочу разобратся именно с рекурсями и патаму написал тот варянт (он вообше из php.su я чуть изменил его)

Panoptik
OrmaJever
Самогонщик
сбасибо балшое
7. caballero - 20 Ноября, 2011 - 00:48:23 - перейти к сообщению
а дебаггером пользоватся в подобнызх случаях какая проблемма?
8. Panoptik - 20 Ноября, 2011 - 01:03:38 - перейти к сообщению
чтобы было наглядно можно разложить функцию и будет видна полная картина:
PHP:
скопировать код в буфер обмена
  1.  
  2.     function factorial($x) {
  3.     if ($x == 0)  { return 1; }
  4.     else { return   $x * factorial($x-1); }
  5.     }
  6.     echo factorial(4);
  7.  
  8. //результат работы следующий:
  9.     function factorial(4) {
  10.        if (4 == 0)  { return 1; }
  11.  //выигрывает эта ветка в условии 4-ка будто как отложилась в памяти а остальные действия продолжаются теперь разложим уровень ниже
  12.        else { return   4 * factorial(3) {
  13.             if (3 == 0)  { return 1; }
  14. //и снова условие не сработало теперь везде фигурирует 3-ка которая тоже как бы откладывается в памяти и теперь имеем ту самую часть 4*3... но это еще не конец
  15.             else { return   3 * factorial(2) {
  16.                   if (2 == 0)  { return 1; }      
  17. //ситуация та же, и снова идем в следующий вызов рекурсии, а тем временем наш пример уже имеет вид 4*3*2...
  18.                   else { return   2 * factorial(1) {
  19.                        if (1 == 0)  { return 1; }
  20. //снова условие не сработало у нас есть наше 4*3*2*1
  21.                        else { return   1 * factorial(0) {
  22.                           if (0 == 0)  { return 1; }
  23. //и тут наконец то мы получаем обычный ретурн в виде 1-цы и как я и говорил наш итоговый расчет имеет вид 4*3*2*1*1 = 24
  24.                        }
  25.                   }
  26.             }
  27.        };
  28.     }
  29.     }
  30.  


синтаксически конечно эта конструкция не правильна, но важно уловить логику и суть происходящего, для достойного владения рекурсией. и еще главное не забывать о детской возможности получить зацикливание. на это стоит обращать внимание
9. dadli - 20 Ноября, 2011 - 23:40:15 - перейти к сообщению
Panoptik

балшои челавечиски спасибо вам за такои падробнои обясненя, очен благароден я, тенкс Улыбка

 

Powered by ExBB FM 1.0 RC1