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