16:56

Frustrated? Yes. Why? Because it is impossible for me to be God.
Я уже по традиции с Python
Функиця, ищущая n-ное число Фибоначчи:
def fibonacci(n):

if n == 0 :

return 0

elif n == 1 :

return 1

else :

return fibonacci(n-1) + fibonacci(n-2)


Нужно оптимизировать так, чтобы рекурсия использовалась один раз. Я уже третий день смотрю на нее и меня не осеняет, никто не подскажет?

@темы: Python

Комментарии
31.10.2010 в 18:29

Ния
Точно именно такое задание?
Может быть, имело ввиду: вызов рекурсии проходил один раз для каждого n?
31.10.2010 в 18:31

Frustrated? Yes. Why? Because it is impossible for me to be God.
Да, ваш вариант, я не совсем правильно перевела, думаю :)
31.10.2010 в 18:36

Ния
Ну тогда создаем массив n чисел, забиваем нулями. При вычислении либо берем значение из массива, либо вычисляем и кладем в массив.
Т.е. по одному высилению каждого числа.
31.10.2010 в 20:47

Frustrated? Yes. Why? Because it is impossible for me to be God.
Не совсем поняла, можно поподробнее про либо берем значение из массива, либо вычисляем и кладем в массив.?
31.10.2010 в 21:20

Ния
Алгоритм функции:
проверить, есть ли искомое число фиб. в массиве (например, не равен ли нулю соответствующий элемент)
если нет - то вычислить (как написано у вас выше, например) и сохранить его в массиве
если есть - то вернуть это число
31.10.2010 в 21:24

Life is a life... We are the humans...
если уж рекурсия так нужна, то я бы сделал так:



напечатает числа без первого 0)) здесь n это просто как счётчик выхода, а в функцию каждый раз передаётся массив всех чисел..
31.10.2010 в 21:30

Life is a life... We are the humans...
в википедии есть формула Бине для чисел фибоначчи, и можно рекурсию использовать чтобы фи^n вычислять, но это имхо уже извращение
01.11.2010 в 00:55

Пау-чок
Помнится, в какой-то книге по лиспу видел что-то подобное (в переложении на пайтон):



Наверное, будет правомочно переписать и так:


Ай, тьфу, блин, фигню написал...
01.11.2010 в 01:59

Пау-чок
Так. Дубль два. Вспомню те же рассуждения, что были в книге.
fibonacci(n) вызывает fibonacci(n-1) и fibonacci(n-2). Но fibonacci(n-1) также вызывает fibonacci(n-2). Непорядок. Надо, чтобы функция вызывалась только единожды с каждым аргументом. Что можно сделать?
Посмотрим... Пусть:

а(n) = fibonacci(n),
b(n) = fibonacci(n+1)

Тогда:

b(n)=a(n+1) <=> a(n)=b(n-1)
b(n)=fibonacci(n+1)=fibonacci(n)+fibonacci(n-1)=a(n)+a(n-1)=b(n-1)+a(n-1)

Т.е. видим, что:
a(n)=b(n-1)
b(n)=b(n-1)+a(n-1)
fibonacci(n)=a(n)
a(0)=fibonacci(0)=0
b(0)=fibonacci(0+1)=1

Получили зависимость a(n) и b(n) от значений a(n-1) и b(n-1). Причём, нигде n явно не фигурирует. Исключительно как счётчик итераций. А значит, нам в общем-то всё равно, будет ли n возрастать c 0 до заданного значения, или же убывать с заданного значения до 0 - общее число итераций там и там будет то же.

Значит, можно написать следующую функцию:


Вроде, должно работать.

P.s. а предыдущего бреда вы не видели, хорошо? =)
01.11.2010 в 19:15

Frustrated? Yes. Why? Because it is impossible for me to be God.
Всем спасибо больше :)