斐波那契數列(fibonacci sequence),又稱**分割數列、因數學家列昂納多·斐波那契(leonardoda fibonacci)以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:f(1)=1,f(2)=1, f(3)=2,f(n)=f(n-1)+f(n-2)(n>=4,n∈n*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從2023年起出版了以《斐波納契數列季刊》為名的乙份數學雜誌,用於專門刊載這方面的研究成果。
(1)、遞迴演算法 (三點: 終止條件(邊界),最優子結構 f(1)=1,f(2)=1, f(3)=2,f(n)=f(n-1)+f(n-2) 狀態轉移公式 f(n)=f(n-1)+f(n-2))
def(2)、優化 遞迴演算法 會重複計算多次同乙個式子 如圖 相同的顏色代表了方法被傳入相同的引數。所以需要記錄下已經計算過得數,防止重複計算fab(n):
#終止條件 邊界
if n <= 2:
return 1
else
:
#最優子結構 狀態轉移公式
return fab(n - 1) + fab(n - 2)
記錄已經計算過得 值
dict_fab ={}
deffab_2(n):
#終止條件 邊界
if n <= 2:
return 1
elif
dict_fab.get(n):
print('*'
)
return
dict_fab.get(n)
else
:
#最優子結構 狀態轉移公式
dict_fab[n] = fab_2(n - 1) + fab_2(n - 2)
return dict_fab[n]
(3)、動態規劃
#(1)、暴力解法最終優化 動態規劃 (大問題化成若干相同型別的子問題 然後乙個個解決子問題)
deffab_3(n):
#由前往後推
a = 1b = 1
if n <= 2:
print('
fab({})={}
'.format(n, b))
return 1
for i in range(n - 2):
(a, b)
a, b = b, a +b
print('
fab({})={}
'.format(n, b))
return b
def(2)、動態規劃(記憶演算法,記錄i 位置的左右 最大數,減少for迴圈層級 時間複雜度 有o(n²)變為 o(n))trap(height):
sum_water =0
size =len(height)
for i in
range(size):
max_left =0
max_right =0
for j in range(0, i + 1):
max_left =max(max_left, height[j])
for j in
range(i, size):
max_right =max(max_right, height[j])
sum_water += min(max_left, max_right) -height[i]
return sum_water
def(3)、雙指標trap_water_dy():
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
sum_water =0
size =len(height)
max_left_lsit = [none]*size
max_left_lsit[0] =height[0]
max_right_list = [none]*size
max_right_list[-1] = height[-1]
for i in range(1, size):
max_left_lsit[i] = max(height[i], max_left_lsit[i - 1])
for i in range(size-1):
max_right_list[size - 2 - i] = max(height[size - 2 - i], max_right_list[size - i - 1])
for i in
range(size):
sum_water += min(max_left_lsit[i], max_right_list[i]) -height[i]
return sum_water
deftrap_two_point():
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
left =0
right = len(height) - 1ans =0
left_max =0
right_max =0
while left
if height[left]
if height[left] >=left_max:
left_max =height[left]
ans += (left_max -height[left])
left += 1
else
: # 當右邊小於左邊時 裝的水量由右邊的最高高度決定
if height[right] >=right_max:
right_max =height[right]
ans += (right_max -height[right])
right -= 1
return ans
Python 實現 動態規劃 斐波那契數列
1 斐波那契數列 斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的...
python斐波那契數列動態規劃
斐波那契類似於1 1 2 3 5 8這樣的數列,當前項等於前兩項之和。根據這個規律就可以用遞迴來做,可是當數字很大的時候,遞迴耗時很長,因此可以採用動態規劃來做。動態規劃 deffeibonacci1 n array 0 1 while len array n 1 array 2 return ar...
動態規劃 斐波那契數列
問 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 斐波那契數列簡單介紹 我的解法 注 從fibonacci n 1 fibonacci n 2 明顯看出使用的是遞迴,此題用遞迴兩三行 即可搞定。但是,若出題者準備著乙個超大的n,那麼很有...