Наверное…

Все мы знаем знаменитую последовательность Фибоначчи, т.е.

0 1 1 2 3 5 8 13 21 34 55 ...

где каждый член просто равен сумме двух предыдущих членов. Все просто, правда? Это также широко используемый метод обучения рекурсии в любом руководстве по языку программирования. Алгоритм, изложенный в этих руководствах, всегда ужасен:

Но как это вообще ужасно ?! Это так просто и просто!

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

Временная сложность этого наивного алгоритма оказывается равной 2 ^ n. Глядя на график ниже, сравнивающий различные временные сложности Big-O, мы можем сделать вывод, что этот алгоритм явно бесполезен для больших чисел.

"Это круто и все такое, что вы можете с этим поделать?"

Просто остановим повторяющиеся вызовы функций. Один из способов сделать это - запоминание. Вы спросите, что это?

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

- Википедия

По сути, мы сохраним предыдущие члены последовательности Фибоначчи, чтобы вычислить дальнейшие члены. Мы можем сделать это с помощью простого массива. Вот простой код Python для этого:

Временная сложность для этого алгоритма оказывается O (n), что довольно хорошо, учитывая, насколько плох был предыдущий. Одна из проблем заключается в том, что вам нужна дополнительная память для хранения терминов в массиве. Я призываю вас найти решение для этого.

Можете ли вы также найти алгоритм для генерации последовательности Фибоначчи с использованием матричного возведения в степень?

#happycoding