Python 實現 動態規劃 斐波那契數列

2022-03-20 19:12:51 字數 3158 閱讀 7089

斐波那契數列(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

fab(n):

#終止條件 邊界

if n <= 2:

return 1

else

:

#最優子結構 狀態轉移公式

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

(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)、動態規劃

#

最終優化 動態規劃 (大問題化成若干相同型別的子問題 然後乙個個解決子問題)

deffab_3(n):

#由前往後推

a = 1b = 1

if n <= 2:

print('

fab({})={}

'.format(n, b))

return 1

for i in range(n - 2):

print

(a, b)

a, b = b, a +b

print('

fab({})={}

'.format(n, b))

return b

(1)、暴力解法

def

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

(2)、動態規劃(記憶演算法,記錄i 位置的左右 最大數,減少for迴圈層級 時間複雜度 有o(n²)變為 o(n))

def

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

(3)、雙指標

def

trap_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,那麼很有...