Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/190: Рейтинг темы: голосов - 190, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 13

Задача «Числа Фибоначчи»

13.07.2020, 17:23. Показов 41036. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день! Объясните, пожалуйста, на пальцах, как работает этот код. Я смотрю по компилятору (например для цифры 6) и, все равно, не понимаю, как он отрабатывает. Ответ он выдает правильный.

Условие
Напишите функцию fib(n), которая по данному целому неотрицательному n возвращает n-e число Фибоначчи. В этой задаче нельзя использовать циклы — используйте рекурсию.

Python
1
2
3
4
5
6
7
def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
 
print(fib(int(input())))
Если что, это не мое решение, но мне интересно разобраться.

Мое решение более костыльное:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def fib(n):
    global index_0
    global index_1
    global i
    global index_n
    index_n = index_0 + index_1
    i += 1
    index_0, index_1 = index_1, index_n
    if n == 1:
        return(1)
    elif i != n:
        return fib(n)
    else:
        return index_n
 
index_0 = 0
index_1 = 1
i = 1
index_n = 0
print(fib(int(input())))
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2020, 17:23
Ответы с готовыми решениями:

Задача про числа Фибоначчи
Добрый день, у меня возникла проблема с решением задачи: "Даны целые числа от 1 до 50. Определить, сколько среди них чисел Фибоначчи и...

Задача 7. «Числа Фибоначчи»
Задание: Написать функцию Fib(N) вычисляющую N-е число последовательности Фибоначчи. Всё это надо написать на языке Python. Вывод...

Введите размер массива N и заполните массив из N элементов числами Фибоначчи. Первые два числа Фибоначчи равны 1, а кажд
Введите размер массива N и заполните массив из N элементов числами Фибоначчи. Первые два числа Фибоначчи равны 1, а каждое следующее равно...

7
8 / 8 / 0
Регистрация: 15.02.2020
Сообщений: 195
13.07.2020, 18:25
seregahlevnoj, изучи рекурсию и всё поймёшь
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
13.07.2020, 18:38
Лучший ответ Сообщение было отмечено seregahlevnoj как решение

Решение

Цитата Сообщение от seregahlevnoj Посмотреть сообщение
Мое решение более костыльное:
- оба решения нехороши.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def fib(n,c=0,p=1):  # Обычная рекурсия
    if (n==0):
        return c
    else:
        return fib(n-1, c+p,c)
        
def fibg(): # Генератор
    c,p=0,1
    while (True):
        q=c+p
        yield q
        p=c
        c=q
        
fib_gen=fibg()        
 
for i in range(1,31):
    print(i,next(fib_gen))
1
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
14.07.2020, 07:53
Если n больше двух, то приходится вычислять два предыдущих числа Фибоначчи и их складывать. Вычислять можно при помощи той же самой функции, но с другим параметром. Единственная логическая трудность здесь та, что мы обращаемся к функции, которая еще не закончила прежнюю работу. Можно это представить себе так, что у функции может быть несколько работ, которые она может приостанавливать и переходить к какой-нибудь другой существующей работе или же начать новую работу. Или можно считать, что написано много вариантов функции с разными именами. Каждый раз, когда надо обратиться к функции мы выбираем тот вариант, который не занят работой.
1
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 13
14.07.2020, 09:57  [ТС]
В задаче рекурсия в рекурсии

Добавлено через 33 секунды
Цитата Сообщение от Infeeqs Посмотреть сообщение
изучи рекурсию и всё поймёшь
В задаче рекурсия в рекурсии

Добавлено через 11 минут
Цитата Сообщение от palva Посмотреть сообщение
Если n больше двух, то приходится вычислять два предыдущих числа Фибоначчи и их складывать. Вычислять можно при помощи той же самой функции, но с другим параметром. Единственная логическая трудность здесь та, что мы обращаемся к функции, которая еще не закончила прежнюю работу. Можно это представить себе так, что у функции может быть несколько работ, которые она может приостанавливать и переходить к какой-нибудь другой существующей работе или же начать новую работу. Или можно считать, что написано много вариантов функции с разными именами. Каждый раз, когда надо обратиться к функции мы выбираем тот вариант, который не занят работой.
Я понимаю, что вы хотите сказать. Однако, на пальцах , как отрабатывает программа мне не ясно. Я через компилятор пытаюсь отследить и вижу следующее.
Как только n = 2 или 1, то функция принимает значение 1, тем самым, как бы, съедая, эти значения. Потом происходит рекурсия в рекурсии и процесс повторяется.
n=
6
5
4
3
2 - процесс пошел
первый раз оно съедает до 3х, потом до 4х, а потом магическим образом выводит ответ --- в итоге таки доходит до суммы двух предыдущих значений.
Я только начал изучать рекурсию. Мне не ясно, куда деваются все эти "съеденные" значения функции. В задачах перед этим с подобным выводом выводится сумма значений.

Добавлено через 11 минут
Цитата Сообщение от Catstail Посмотреть сообщение
def fib(n,c=0,p=1):  # Обычная рекурсия
    if (n==0):
        return c
    else:
        return fib(n-1, c+p,c)
Благодарю, немного помучился с заданием переменных через global. Не знал, что можно прямо в функции задать так параметры и return. Так просто выглядит.

За генератор также спасибо!
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
14.07.2020, 10:54
seregahlevnoj, Когда вы печатаете переменные из программы, то программа использует те значения, которые относятся к работе, которую она выполняет. Для каждого входа в программу создается контекст исполнения (работа), которая содержит значения параметров, локальных переменных и место, на которой работа была прервана. После выхода из программы контекст уничтожается (затирается контекстами других работ) Так что у параметров и переменных одновременно существует много разных значений в разных контекстах.
0
0 / 0 / 0
Регистрация: 18.06.2020
Сообщений: 13
14.07.2020, 11:13  [ТС]
Благодарю, вы интересно описываете все словами. Более привычно видеть пример в коде. Тогда решение, кмк, легче воспринимается.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
14.07.2020, 21:35
seregahlevnoj, а разве у вас не было кода? Вы с него начали и попросили объяснить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.07.2020, 21:35
Помогаю со студенческими работами здесь

Задача (числа фибоначчи)
Найти количество чисел Фибоначчи на промежутке от m до n, которые делятся на 3.

Задача на Числа Фибоначчи
Числа Фибоначчи определяются по следующему закону: a1=1, a2=1, an+1=an+an-1. Суммировать подряд идущие члены Фибоначчи до тех пор, пока...

Задача на числа Фибоначчи
Сама задача: Write a function that returns the nth record in the Fibonacci sequence, where n is the number that is passed as an argument...

Задача на Числа Фибоначчи
Числа Фибоначчи определяются по следующему закону: a(1)=1, a(2)=1, a(n+1)=a(n)+a(n-1). Суммировать подряд идущие члены Фибоначчи до тех...

Задача на C++ числа Фибоначчи
Числа последовательности Фибоначчи образуются по следующему правилу: первое и второе числа равны 1. Каждое последующее число равно сумме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru