動態規劃 肥波那期數列 被小瞧了的斐波那契數列

2021-10-14 15:58:42 字數 3448 閱讀 4649

一聽到斐波那契數列,給人的感覺總是很簡單,畢竟很多例題裡基礎例子就是它,常用方法就是遞迴,動態規劃等等。可是!昨天我在查詢資料的時候 突然發現斐波那契怎麼有這麼多解法???這不是我認識的斐波那契呢!於是我決定一**竟....

首先了解一下,斐波那契數列是這樣的數列:0、1、1、2、3、5、8、13、21、34 ……

**實現

1.遞迴法(適用於數值較小情況)

# function for nth fibonacci number 

def fibonacci(n):

if n<0:

print("incorrect input")

# first fibonacci number is 0

elif n==0:

return 0

# second fibonacci number is 1

elif n==1:

return 1

else:

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

2.動態規劃:在遞迴實現時,已經計算過的數值有重複計算的情況,動態規劃法將計算過的數值儲存下來,在後續過程中可以直接使用,避免了重複計算。

# fibonacci series using dynamic programming  

def fibonacci(n):

# taking 1st two fibonacci nubers as 0 and 1

fibarray = [0, 1]

while len(fibarray) < n + 1:

if n <= 1:

return n

else:

if fibarray[n - 1] == 0:

fibarray[n - 1] = fibonacci(n - 1)

if fibarray[n - 2] == 0:

fibarray[n - 2] = fibonacci(n - 2)

fibarray[n] = fibarray[n - 2] + fibarray[n - 1]

return fibarray[n]

3.迭代法:對空間利用率進行了優化,令前兩位分別為0和1,剩下的數值(若有)進行迴圈計算最終解。

# function for nth fibonacci number - space optimisataion 

# taking 1st two fibonacci numbers as 0 and 1

def fibonacci(n):

a = 0

b = 1

if n < 0:

print("incorrect input")

elif n == 0:

return a

elif n == 1:

return b

else:

for i in range(2,n+1):

c = a + b

a = b

b = c

return b

4.利用裝飾器快取遞迴(適用於數值較大情況,注意python遞迴層數限制)

def decorate(func):

cache = {}

def wrap(n):

if n not in cache:

cache[n] = func(n)

return cache[n]

return wrap

@decorate

dedef fibonacci(n):

if n<0:

print("incorrect input")

# first fibonacci number is 0

elif n==0:

return 0

# second fibonacci number is 1

elif n==1:

return 1

else:

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

5.通項公式法和快速冪演算法(適用於超大資料位值1w+)

# helper function that multiplies  

# 2 matrices f and m of size 2*2,

# and puts the multiplication

# result back to f

# helper function that calculates

# f raise to the power n and

# puts the result in f

# note that this function is

# designed only for fib() and

# won't work as general

# power function

def fib(n):

f = [[1, 1],

[1, 0]]

if (n == 0):

return 0

power(f, n - 1)

return f[0][0]

def multiply(f, m):

x = (f[0][0] * m[0][0] +

f[0][1] * m[1][0])

y = (f[0][0] * m[0][1] +

f[0][1] * m[1][1])

z = (f[1][0] * m[0][0] +

f[1][1] * m[1][0])

w = (f[1][0] * m[0][1] +

f[1][1] * m[1][1])

f[0][0] = x

f[0][1] = y

f[1][0] = z

f[1][1] = w

def power(f, n):

m = [[1, 1],

[1, 0]]

# n - 1 times multiply the

# matrix to ,}

for i in range(2, n + 1):

multiply(f, m)

趣味讀物:

向日葵中的斐波那契:

斐波那契的**比例:

**實現:

斐波那契數列通項公式推導:

(1)

(2)

(3)

整理完這些,一晚上時間就這麼過去了,時間果然如流水....

動態規劃的方法求解斐波那契數列

參考 如果乙個遞迴演算法 需要對相同的子問題進行多次重複計算,那麼我們通常可以採用動態規劃對其進行優化。動態規劃的具體實現可以分為兩類 一類是自頂向下的備忘錄方法 製表或者記憶 增加乙個子問題解的記錄,每當需要用到乙個子問題的解時,首先檢視這個記錄,如果記錄中存在需要的解,則可直接得到,如果不存在,...

斐波那契數列的多種解法 遞迴 動態規劃

斐波那契數列 0 1 1 2 3 5 8 13 21 34 遞推的方法定義 f 0 0,f 1 1,f n f n 1 f n 2 n 2,n n coding utf 8 created on wed mar 3 10 58 27 2021 author dujidan from collecti...

斐波那契數列問題的遞迴和動態規劃2

斐波那契數列問題的遞迴和動態規劃2 給出乙個整數 n,代表台階數,一次可以跨 2 個或者 1 個台階,請輸出有多少種走法。輸入描述 第一行乙個整數 n。輸出描述 輸出走法數對 1e9 7 取模的值。示例1輸入3輸出3備註 1 n 1018 1 leq n leq 10 1 n 10 18題解 跟前面...