Если вы еще сами не попытались написать
рекурсивную функцию Фибоначчи,
я настоятельно рекомендую вам сделать это
или, по крайней мере, попробовать.
Небольшая серьезная задача перед тем, как вы посмотрите это видео.
Но если вы уже это сделали или просто не хотите,
то можете продолжить смотреть наш урок.
Давайте начнем с вами писать рекурсивную функцию Фибоначчи
в соответствии с теми условиями, которые я дал вам в самом начале,
когда задал задание написать эту функцию.
Снова назову ее fibonacci. Есть параметр n.
То есть кто-то должен дать какое-то число программе,
точнее член последовательности Фибоначчи,
значение которого нам нужно найти,
но на этот раз мы напишем эту функцию рекурсивно.
В дальнейшем мы увидим, что на самом деле
написание функции Фибоначчи рекурсивно является довольно интуитивным.
Это похоже на магию. А еще будет видно,
что это не самый эффективный способ написания данной функции.
Каждый раз, когда вы пишите любую рекурсивную программу,
вам нужно четко подумать над основными вопросами.
И основным фактором в последовательности Фибоначчи…
Хотя их здесь будет 2.
Итак, нулевой элемент последовательности
и первый элемент последовательности,
их значения даны нам по определению.
Допустим, надо найти значение нулевого элемента, то есть n = 0.
Это значит, что нам нужен нулевой элемент,
который на самом деле и будет равен 0.
И мы также можем написать elif, что означает else if, ещё если.
Итак, elif n = 1. Тогда должны получить 1, так как нулевой элемент равен 0.
Первый элемент в последовательности fibonacci — это 1.
Теперь и увидим немного магии.
В ином случае вернуть, и это очень здорово, fibonacci от n − 1,
то есть любой предыдущий элемент в последовательности fibonacci…
Любой предыдущий элемент в последовательности fibonacci…
Плюс fibonacci от n − 2… Плюс fibonacci от n − 2.
Кажется, это должно сработать.
Именно поэтому для меня это выглядит, как магия.
Если нам нужно знать значение нулевого элемента, то он равен 0.
Если нужно знать значение первого элемента, он равен 1.
Давайте я здесь поставлю два пробела. Итак, первый элемент равен 1.
Если нам нужно знать значение любого другого элемента,
то есть else, а это else if, но ещё если ни одно из этих условий не верно,
если это ни 0, ни 1, если это какое-то другое число, то оно будет…
И мы с вами предположим, что нам нужно ввести
какое-то неотрицательное целое число сюда.
Программа не сработает, если мы введем какое-то отрицательное значение.
Допустим, что у нас есть неотрицательное целое число,
можем сказать, если это не нулевой или не первый элементы,
тогда можно использовать функцию fibonacci
от предыдущего элемента последовательности
и сложить это с функцией от элемента,
который на два значения меньше изначального.
Можете попробовать сами. Например, вы хотите найти fibonacci от 2.
В данном случае n не равно 0, тогда мы не выполняем это условие,
и n не равно 1, значит, условие также не выполняется.
Тогда в итоге мы получим fibonacci от 2 − 1…
То есть fibonacci от 1 плюс fibonacci от 2 − 2; плюс fibonacci от 0.
Итак, значение fibonacci от 1 — это 1,
а fibonacci 0 — 0, получаем 1 + 0, то есть 1.
Продолжаем дальше. Попробуем fibonacci от 3.
Это сработает, поскольку fibonacci от 0, 1 или 2 является верными.
А функция fibonacci от 3 разложится на fibonacci от 2 плюс fibonacci от 1,
а теперь знаем, что fibonacci от 2 равно 1, а fibonacci от 1 — 1.
Получаем 1 + 1, то есть 2. Работает программа исправно.
А теперь попробуем… Сперва сохраним все это.
Забыл сохранить название файла, Recursive Fibonacci. Хорошо.
Это файл формата «.py». Теперь запущу программу.
Все это определяет функцию внутри этой среды.
И затем мне всего лишь нужно сослаться на эту функцию.
Запустим. Просим найти fibonacci от 4. Получился правильный ответ.
fibonacci от 10 — 55. Правильный ответ.
Давайте попробуем что-нибудь попроще.
fibonacci от 0, нулевой элемент, 0. Да, программа работает.
Именно поэтому рекурсия в каком-то смысле напоминает магию.
Можно ещё упростить этот код.
Возможно, вы заметили, что нулевой член
в последовательности fibonacci равен 0, а первый — единице.
Значит, если нужно найти нулевой
или первый элементы последовательности,
то оба будут равны этому же числу.
Поэтому мы могли бы немного упростить.
Если мы с вами предположим, что кто-то собирается ввести сюда
неотрицательное целое число, то можем написать:
если n равно 0, или n равно 1, то вернуть n.
Итак, если n равно 0, или n равно 1, в таком случае вернуть значение n.
Посмотрим, сработает ли эта программа.
Это немного упрощает наш с вами код.
Давайте сохраним его, а теперь запустим.
Попробуем fibonacci от 10.
Она так же работает, потому что на самом деле
нулевой элемент равен 0, а первый равен 1.
Мы получили правильный ответ,
но мы можем ещё упростить эту программу.
Можем написать: если n меньше 2, то это также должно сработать,
так как если n равно 0 или 1, то мы должны получить обратно n,
или же придется выполнять все эти действия.
Давайте попробуем. Запустим программу.
Давайте вычислим fibonacci от 10.
Похоже, что теперь компьютер может выполнять эти действия быстрее.
Все это и это вот здесь.
Но, если вы хотите увидеть всю работу, совершенную программой,
все вызовы функции fibonacci, вы можете…
Давайте напишем здесь команду print.
Теперь каждый раз, когда программа вызывает функцию fibonacci,
она будет отображать текст fibonacci двоеточие…
Давайте я добавлю к этой строке текста значение аргумента.
Значение аргумента. В нашем случае аргументе равен n.
Я хочу удостовериться, что это будет отображаться в виде строки.
Ввожу это значение внутри строки.
Программа всего лишь возьмет целое число и поместит его в строку,
тогда мы с вами получим одну большую строку.
Посмотрим, что произойдет.
Сперва попробую это с небольшими значениями.
Итак, мы определили функцию. Давайте я напишу fibonacci от 3.
Заметьте, когда я ввел это значение,
программа вызвала функцию fibonacci от 3.
Затем, чтобы высчитать значение fibonacci от 3,
программа вызвала fibonacci от 2 и fibonacci от 1.
Затем, дабы получить значение fibonacci от 2,
программа вызвала fibonacci от 0 и fibonacci от 1.
То есть программе потребовалось сослаться на все эти функции,
чтобы только вычислить значение fibonacci от 3,
и только затем мы с вами получили ответ.
Если бы мы написали fibonacci от 10, то произошло бы что-то нереальное.
Поэтому я не стану этого делать.
Давайте я лучше напишу fibonacci от 6 и вы увидите,
сколько раз программе приходится вызывать другие функции.
Большое количество раз.
То есть это достаточно объемная вычислительная работа.
Но компьютеры очень быстры, поэтому вы даже этого не замечаете.
В следующий раз мы с вами побольше поговорим о том, как узнать,
сколько существует различных способов вычисления функции.
Будет интересно. До встречи в следующем ролике!
Subtitles by the Amara.org community
