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*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從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
1else
:# 最優子結構 狀態轉移公式
return fab(n -1)
+ fab(n -
2)
(2)、優化 遞迴演算法 會重複計算多次同乙個式子 如圖 相同的顏色代表了方法被傳入相同的引數。所以需要記錄下已經計算過得數,防止重複計算
'''# 記錄已經計算過得 值
dict_fab =
deffab_2
(n):
# 終止條件 邊界
if n <=2:
return
1elif dict_fab.get(n)
('*'
)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 =1 b =
1if n <=2:
print
('fab({})={}'
.format
(n, b)
)return
1for i in
range
(n -2)
:print
(a, b)
a, b = b, a + b
print
('fab({})={}'
.format
(n, b)
)return b
2、盛水問題 python解法(1)、暴力解法
'''
'''def
trap
(height)
: sum_water =
0 size =
len(height)
for i in
range
(size)
: max_left =
0 max_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(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)-1
ans =
0 left_max =
0 right_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 實現 動態規劃 斐波那契數列
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
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,那麼很有...