Frustrated? Yes. Why? Because it is impossible for me to be God.
Я уже по традиции с Python
Функиця, ищущая n-ное число Фибоначчи:
Нужно оптимизировать так, чтобы рекурсия использовалась один раз. Я уже третий день смотрю на нее и меня не осеняет, никто не подскажет?
Функиця, ищущая n-ное число Фибоначчи:
def fibonacci(n):
if n == 0 :
return 0
elif n == 1 :
return 1
else :
return fibonacci(n-1) + fibonacci(n-2)
Нужно оптимизировать так, чтобы рекурсия использовалась один раз. Я уже третий день смотрю на нее и меня не осеняет, никто не подскажет?
-
-
31.10.2010 в 18:29Точно именно такое задание?
Может быть, имело ввиду: вызов рекурсии проходил один раз для каждого n?
-
-
31.10.2010 в 18:31-
-
31.10.2010 в 18:36Ну тогда создаем массив n чисел, забиваем нулями. При вычислении либо берем значение из массива, либо вычисляем и кладем в массив.
Т.е. по одному высилению каждого числа.
-
-
31.10.2010 в 20:47-
-
31.10.2010 в 21:20Алгоритм функции:
проверить, есть ли искомое число фиб. в массиве (например, не равен ли нулю соответствующий элемент)
если нет - то вычислить (как написано у вас выше, например) и сохранить его в массиве
если есть - то вернуть это число
-
-
31.10.2010 в 21:24напечатает числа без первого 0)) здесь n это просто как счётчик выхода, а в функцию каждый раз передаётся массив всех чисел..
-
-
31.10.2010 в 21:30-
-
01.11.2010 в 00:55Помнится, в какой-то книге по лиспу видел что-то подобное (в переложении на пайтон):
Наверное, будет правомочно переписать и так:
Ай, тьфу, блин, фигню написал...
-
-
01.11.2010 в 01:59fibonacci(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