斐波那契數列問題解法總結 遞迴 動態規劃 矩陣冪

2021-09-24 03:45:17 字數 2432 閱讀 4713

時間複雜度

def fibonacci(n):

if n == 1:

return 1

elif n == 2:

return 1

elif n > 2:

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

for n in range(1,100):

print(n,':', fibonacci(n))

時間複雜度

fibonacci_cache = {}

def fibonacci(n):

if n in fibonacci_cache:

return fibonacci_cache[n]

if n == 1:

value = 1

elif n == 2:

value = 1

elif n > 2:

value = fibonacci(n-1) + fibonacci(n-2)

fibonacci_cache[n] = value

return value

for n in range(1,100):

print (n,':', fibonacci(n))

時間複雜度

def fibonacci(n):

if n == 1:

return 1

elif n == 2:

return 1

a = 1

b = 2

tmp = 0

for i in range(3,n):

tmp = a + b

a = b

b = tmp

return tmp

for n in range(1,100):

print(n,':', fibonacci(n))

from functools import lru_cache

@lru_cache(maxsize = 1000, typed=false)

def fibonacci(n):

if n == 1:

return 1

elif n == 2:

return 1

elif n > 2:

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

for n in range(1,100):

print(n,':', fibonacci(n))

lru: least recently used cache. 即為字面意思,儲存快取中的資料,下次用到時直接呼叫,也是動態規劃空間換時間的思想。引數如下:

maxsize: 是儲存最近的多少個快取中的結果,預設為 128。

type: type 如為 true,即把不同引數型別得到的結果分開儲存,如 f(3) 和 f(3.0) 會被區分開。 

時間複雜度

首先,斐波那契數列遞推公式為:

用矩陣運算形式表示為:

那麼進一步推導:

所以求和問題轉化為求矩陣冪的問題。此處求矩陣冪用二分法,**中使用的是遞迴方法求矩陣冪。

from numpy import *

import numpy as np

def mat_power(matrix, n):

if n == 1:

return matrix

if n % 2 == 0:

tmp = mat_power(matrix, n/2)

return np.dot(tmp,tmp)

else:

tmp = mat_power(matrix, floor(n/2))

return np.dot(np.dot(tmp,tmp),matrix)

def fibonacci(n):

a = array([[1,1],[1,0]],dtype=object)

#注意這裡dtype=object,預設為int64。當n>93時,int64會overflow。

if n == 1:

return 1

elif n == 2:

return 1

else:

result = np.dot(mat_power(a, n-2), array([[1],[1]]))

return int(result[0])

for n in range(1,100):

print(n,':', fibonacci(n))

斐波那契數列解法

方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...

斐波那契數列解法

1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...

斐波那契數列 題解

原題出自ural 1133。題目大意 擴充套件斐波那契數列在整數集上的定義,即不是從f0 0,f1 1 這樣子開始的,下標可以是任意整數。給定這樣乙個序列中的兩個下標,i,j,以及他們在序列中對應的值fi fj 然後要求fn n是輸入的乙個數字 思路1 由於題目裡說到資料範圍在 2 109 fk 2...