PHP: function fib($num) { if ($num < 2) { return $num; } return fib($num - 1) + fib($num - 2); } echo fib(4); Формула вычисления числа Фибоначчи по его порядковому номеру. Если этот скрипт разложить для понимания, то получится вот такая схема fib(4) fib(3) + fib(2) fib(2) + fib(1) + fib(1) + fib(0) fib(1) + fib(1) + fib(1) + fib(0) Объясните пожалуйста, почему если изменить данный скрипт вот так вот, то возвращает он значение 14. Код (Text): <?php function fib($num) { if ($num < 2) { return $num; } return $num + fib($num - 1) + fib($num - 2); } echo fib(4); ?> return $num + fib($num - 1) + fib($num - 2);
@Sinevik отладка/debug http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html https://php.ru/forum/threads/howto-...i-po-shagam-i-s-kartinkami.58974/#post-474550
Ох. Это займёт наверно кучу времени, а мне бы сейчас с рекурсией разобраться. У меня курсы в интернете оплачены. Я потратил 2 дня на то что бы у меня wampserver заработал на винде, качал устанавливал тут всё что мог
Ну если вкратце,на каждом уровне глубины рекурсии,где if дает false у тебя в return $num прибавляется к результату fib($num - 1) + fib($num - 2); Отсюда и получается 14.Что бы тебе проще было,возьми число 3 например и прогони по твоей функции его либо на листочке,либо в уме.
Нифига не понимаю почему тут 14, получается всё что угодно но только не 14. Короче ладно тогда, фиг с ним
@Sinevik Так красавица не паникуй. У нас рекурсию всего то в 5 ом классе средней школы проходят. Слушай внимательно объясню что такое рекурсия - это когда объект является частью самого себя(Это математически). А что же касается программирования то тут это выглядит так: PHP: function a($a) { $a = $a +1; // Тут мы плюсуем 1 к нашему значению передаваемому в функции // напишем условие входа в рекурсию if(a < 3) { // И вот ключевой момент нашей операции ниндзя // Готов? // и ? // ТАДАДАМ!!!!!!!!! a($a); // Вызываем рекурсию при помощи вызова функции a(), а то есть вызова самой себя. } // И наконец-то выход из рекурсии return a; } Ну надеюсь красавица ты понял что такое рекурсия. И закрепим в двух словах. Рекурсия в программировании - Это вызов функции которая вызывает себя же.
Ну так я это понял. Я же разложил Фибоначчи уже в вопросе --- Добавлено --- Так и есть) просто некоторые люди любят повыпендриваться перед новичками. Я обычно не обращаю внимания.
это да --- Добавлено --- только что хотел попытался объяснить это. Для этого нужно с начала объяснить себе. Начал объяснять себе и понял, что себе я это буду объяснять очень долго, а потом еще дольше тебе. Короче лучше сам) Очень закручено там всё получается.
На самом деле c var_dump() можно упростить понимание,посмотрев некоторые промежуточные результаты: PHP: function fib($num) { if ($num < 2) { return $num; } var_dump($val = $num + fib($num - 1) + fib($num - 2)); return $val; } fib(4); Код (Text): int(3) int(7) int(3) int(14)
@Sinevik Слушай принцесса, . Если ты такой умный тогда почему ты не мог сделать вот так: PHP: $i = 0; // Кол-во наших итераций function fib($num, $i) { $i++; $str= ''; for($b=0;$b<$i;$b++) { $str .= '_'; } echo '<br><br> '.$str.$i.' : '.$num; if ($num < 2) { return $num; } $res = $num + fib($num - 1, $i) + fib($num - 2, $i); return $res; } echo '<br><br>'.fib(4); Рекурсия - это банальная математика 5 класса, а то что у тебя происходит это рекурсия плюс геометрическая прогрессия ну её проходят в 6 ом классе. И посмотреть на экран монитора и разложить всё по полочкам ? Тебе нужны не не обращать внимание а слушать и пытаться хоть чему нибудь научиться когда тебе говорят.
Потому что num на каждом уровне рекурсии прибавляется. Вообще, любимый пример всех времён и народов - числа Фибоначчи, это самое неудачное использование рекурсии (потому что одни и те же числа Фибоначчи вычисляются хренову тучу раз). Все объясняют рекурсию на Фибоначчи, поскольку там изначальная формула рекуррентная. Но вычислять его так в какой-нибудь проге, где реально нужны числа Фибоначчи - напрашиваться на неприятности. Об этом хорошо у Н. Вирта написано в "Алгоритмы + структуры данных=программы" (кстати, обязательно читать, хотя там примеры все на Pascal. При своей простоте даёт понимание процесса).
да в отличии от тебя я могу посчитать геометрическую прогрессию. Тебе сразу сказали дебгни . А ты что сделал, ты поплакался в платочек и сдался. Вместо того чтобы напрячь свои извилины хотя бы на чуть чуть, если ты будешь в программировании сдаваться перед каждой такой задачей, ты никогда не станешь программистом, можешь сразу закрыть курс свой и пойти заняться чем нибудь другим. --- Добавлено --- @mkramer да он до сих пор не понимает что такое рекурсия и прогрессия
@Sinevik Шансы что ты будешь нормальным прогером ну очень малы, примерно 0,00001% :3 Без шуток. Лучше отложи курс в сторону и попробуй себя в другом направлении.
@askanim подуспокойся уже. --- Добавлено --- @Sinevik дебаггинг это не долго. Ты в чем работаешь? Ставлю, что в блокноте. Если так, то зря. Тебе нужна нормальная IDE, к ней можно подключить дебаггер. Гайдов - полный интернет. Справится даже новичок. Я всем советую IDE phpStorm, она шикарная. Далее - при дебаге ты можешь буквально поставить приложение на паузу посреди его работы, заглянуть внутрь и отследить прям прям пошагово, что там, куда, как, откуда, заглянуть в каждую переменную, проверить каждое условие, все как под микроскопом. Это очень помогает в поиске ошибок и в исправлении/понимании логики кода. Займись этим делом - глаза боятся, руки делают. Там ничего сложного нет. --- Добавлено --- +1. Куда логичнее объяснять рекурсию на примерах типа сборки деревьев, где прям вот очевидно, на кой черт она нужна и как работает.
Ну даже с практической точки зрения - числа Фибоначчи считать лично мне вот так ни разу и не пришлось. А с древовидными структурами работать - постоянно.