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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: рекурся и работа конструкции return

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: ползователские функции
dadli
Отправлено: 19 Ноября, 2011 - 20:59:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Май 2011  
Откуда: тифилис


Помог: 5 раз(а)




здраствуите.
почему етот код не возврашает число 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, обясните пожалуиста почему?

(Отредактировано автором: 19 Ноября, 2011 - 23:11:19)

 
 Top
Самогонщик
Отправлено: 19 Ноября, 2011 - 21:03:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




Потому перед тем как вернуть значение оно вычисляется, т.е. вычисляется фрактал для трёх, двух и одного.
 
 Top
OrmaJever Модератор
Отправлено: 19 Ноября, 2011 - 23:02:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Если $x не равно 0 то вычисляется else
PHP:
скопировать код в буфер обмена
  1. return {  $x * factorial($x-1); }

а тут написано (если $x = 4) 4 * 3 * 2 * 1 = 24


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
dadli
Отправлено: 19 Ноября, 2011 - 23:06:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Май 2011  
Откуда: тифилис


Помог: 5 раз(а)




но есть момент, так скажем "последний шаг", где $х ровно 0 (нулл), a почему не вернёт функця число 1? в условие же так написано? ето не понимаю Однако
 
 Top
Panoptik
Отправлено: 19 Ноября, 2011 - 23:24:03
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




оно и вернуло 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.  

(Отредактировано автором: 19 Ноября, 2011 - 23:29:14)



-----
Just do it
 
 Top
dadli
Отправлено: 20 Ноября, 2011 - 00:43:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Май 2011  
Откуда: тифилис


Помог: 5 раз(а)




Panoptik
спаисоб балшое хорошие обасненя Улыбка
Цитата:
кстати зачем извращаться с рекурсией


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

Panoptik
OrmaJever
Самогонщик
сбасибо балшое
 
 Top
caballero
Отправлено: 20 Ноября, 2011 - 00:48:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а дебаггером пользоватся в подобнызх случаях какая проблемма?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Panoptik
Отправлено: 20 Ноября, 2011 - 01:03:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




чтобы было наглядно можно разложить функцию и будет видна полная картина:
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.  


синтаксически конечно эта конструкция не правильна, но важно уловить логику и суть происходящего, для достойного владения рекурсией. и еще главное не забывать о детской возможности получить зацикливание. на это стоит обращать внимание

(Отредактировано автором: 20 Ноября, 2011 - 01:05:01)



-----
Just do it
 
 Top
dadli
Отправлено: 20 Ноября, 2011 - 23:40:15
Post Id



Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Май 2011  
Откуда: тифилис


Помог: 5 раз(а)




Panoptik

балшои челавечиски спасибо вам за такои падробнои обясненя, очен благароден я, тенкс Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB