日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 实现 动态规划 /斐波那契数列

發布時間:2025/3/20 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 实现 动态规划 /斐波那契数列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、斐波那契數列

斐波那契數列(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*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1963年起出版了以《斐波納契數列季刊》為名的一份數學雜志,用于專門刊載這方面的研究成果。

(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 1else:# 最優子結構 狀態轉移公式return fab(n - 1) + fab(n - 2)

(2)、優化 遞歸算法 會重復計算多次同一個式子 如圖 相同的顏色代表了方法被傳入相同的參數。所以需要記錄下已經計算過得數,防止重復計算

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 記錄已經計算過得 值 dict_fab = {}def fab_2(n):# 終止條件 邊界if n <= 2:return 1elif 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)、動態規劃

# 最終優化 動態規劃 (大問題化成若干相同類型的子問題 然后一個個解決子問題) def fab_3(n):# 由前往后推a = 1b = 1if n <= 2:print('fab({})={}'.format(n, b))return 1for i in range(n - 2):print(a, b)a, b = b, a + bprint('fab({})={}'.format(n, b))return b

2、盛水問題 Python解法

(1)、暴力解法

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def trap(height):sum_water = 0size = len(height)for i in range(size):max_left = 0max_right = 0for 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(n2)變為 o(n))

def trap_water_dy():height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]sum_water = 0size = len(height)max_left_lsit = [None]*sizemax_left_lsit[0] = height[0]max_right_list = [None]*sizemax_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)、雙指針

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def trap_two_point():height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]left = 0right = len(height) - 1ans = 0left_max = 0right_max = 0while left < right: # 循環數組一遍if height[left] < height[right]: # 當左邊的小于右邊的 能裝多少水 由左邊的最高高度決定if height[left] >= left_max:left_max = height[left]ans += (left_max - height[left])left += 1else: # 當右邊小于左邊時 裝的水量由右邊的最高高度決定if height[right] >= right_max:right_max = height[right]ans += (right_max - height[right])right -= 1return ans

總結

以上是生活随笔為你收集整理的Python 实现 动态规划 /斐波那契数列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。