Сложность рекурсивного алгоритма Фибоначчи

13

Используя следующий рекурсивный алгоритм Фибоначчи:

def fib(n):
   if n==0:
      return 0
   elif n==1
      return 1
   return (fib(n-1)+fib(n-2))

Если я введу число 5, чтобы найти fib (5), я знаю, что это выведет 5, но как мне проверить сложность этого алгоритма? Как рассчитать соответствующие шаги?

джокер
источник
Я искал то же самое, и я наткнулся на это видео MyCodeSchool, я рекомендую проверить это.
snbk97

Ответы:

23

В большинстве случаев вы можете представлять рекурсивные алгоритмы, используя рекурсивные уравнения. В этом случае рекурсивное уравнение для этого алгоритма имеет вид . Затем вы можете найти замкнутую форму уравнения, используя метод подстановки или метод разложения (или любой другой метод, используемый для решения повторений). В этом случае вы получите T ( n ) = Θ ( ϕ n ) , где ϕT(N)знак равноT(N-1)+T(N-2)+Θ(1)T(N)знак равноΘ(φN)φэто золотое сечение ( )φзнак равно(1+5)2

Если вы хотите узнать больше о том, как решать повторения, я настоятельно рекомендую вам прочитать главу 4 « Введение в алгоритмы» .

ees_cu
источник
0

в качестве альтернативы рекуррентным отношениям / математическому анализу (но не замене ) простое эмпирическое упражнение, которое, по-видимому, не преподается очень часто на уроках, но очень информативно, состоит в подсчете количества выполнений функции, а затем на графике подсчета для диапазона малых п входов, а затем кривой соответствуют результату. результаты будут в целом близко соответствовать теоретическому математическому подходу.

Хороший вспомогательный материал для этого упражнения можно найти в бесплатной онлайн главе 3 « Время выполнения алгоритмов / Основы информатики» , Уллман.

ВЗН
источник
1) Составление графиков никоим образом не заменяет формальный анализ. Это легко одурачить. 2) Я думаю, что вы искажаете источник, который цитируете. Они упоминают заговор, но не как способ определить «сложность». 3) FWIW, я не согласен с подходом, и он используется, как представляет Ульман, но это не ваша вина.
Рафаэль
1
Ответ начинается, по сути, с вашего отказа от ответственности, говоря, что построение графиков не заменяет математический анализ . построение графиков - это научный метод, и говорить / наблюдать, что его иногда вводят в заблуждение, значит изучать / вызывать статистические аспекты данных, что является еще одним главным аспектом научного анализа . сказать, что это «легко обмануть», довольно драматично, есть «патологические» случаи, когда он терпит неудачу, но они, как правило, «придуманы» ... вопрос заключался в том, чтобы изучить сложность алгоритма, а эмпирический анализ является ключевым аспектом / угол на это, и, очевидно, не единственный угол и т.д ...
vzn
0

Результатом fib (n) является сумма всех рекурсивных вызовов, которые вернули 1. Следовательно, существует ровно fib (n) рекурсивных вызовов, оценивающих fib (1). Таким образом, время выполнения Ω (fib (n)); вам нужно показать, что вызовы, возвращающие 0, и другие рекурсивные вызовы не вносят существенных изменений в это.

То же самое относится к любой рекурсивно определенной функции, которая либо возвращает 1, либо 0, либо результат другого рекурсивного вызова.

gnasher729
источник
Ω
Не стесняйтесь редактировать ответ, если вы сильно к нему относитесь.
gnasher729
0

T(N)знак равноT(N-1)+T(N-2) T(N)>2T(N-2)T(N-1)>T(N-2)T(N)знак равноΩ(сN)

Wabbit
источник