斐波那契數列1
(fibonacci sequence),又稱**分割數列、因數學家萊昂納多·斐波那契(leonardoda
fibonacci)以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣乙個數列:0、1、1、2、3、5、8、13、21、34、……
先來看看用遞迴的方法是怎麼寫的
def
f(n:
int)
->
int:
if n ==0:
return
0elif n <=2:
return
1 arr =[0
]*(n+1
)def
helper
(meno, n)
:if n ==
1or n ==2:
meno[n]=1
return meno[n]
if arr[n]!=0
:# 優化,在遞迴之前先去陣列檢視,如果已經遞迴過了直接拿出來用
return arr[n]
meno[n]
= helper(arr, n-1)
+ helper(arr, n-2)
return arr[n]
return helper(arr, n)
為什麼加上了個偽字,這是因為對於斐波拉契數列來說,並沒有涉及到動態規劃求最優解(最值)的過程,而是用到了動態規劃的解題思維
我們知道,斐波那契數列的原理當前值為前兩個值之和,而初始值為0和1
那麼,問題的狀態轉移方程就出來了,即描述問題結構的數學公式?
1# 再計算斐波那契數列時存在初始值0,得對n進行+1操作
dp =[0
]* n # 定義dp table
for i in
range
(n):
if i in(0
,1):
# 對前兩個值初始化
dp[i]
= i else
: dp[i]
= dp[i-1]
+ dp[i-2]
return dp[-1
]將上面的**進行簡化,可以這麼去寫??
def
fib(n:
int)
->
int:
n +=
1# 再計算斐波那契數列時存在初始值0,得對n進行+1操作
dp =[0
]* n
dp[:2
]=[0
,1]# 對前兩個值初始化
for i in
range(2
, n)
: dp[i]
= dp[i -1]
+ dp[i -2]
return dp[n -
1]
此方法是根據上面所使用到的偽動態規劃方法優化而來,根據斐波那契數列轉移方程可知,當前值與前兩個值有關,那麼只要想辦法儲存前兩個值就可以進一步優化
def
fib(n:
int)
->
int:
if n ==0:
return
0 prev, curr =0,
1# 定義初始值
for _ in
range
(n-1):
sum_ = prev + curr # 計算前兩個值之和
prev = curr # 當前的值變成上乙個值
curr = sum_ # 更新當前值
return curr # 返回當前值
在python中,可以實現同時賦值,其寫法如下
a, b = 1, 2
根據這個特性,再去改寫一下**
def
fib(n:
int)
->
int:
if n ==0:
return
0 prev, curr =0,
1for _ in
range
(n-1):
prev, curr = curr, prev+curr # 同時進行賦值
return curr # 返回當前值
在python中,我們成功從最初的偽動態規劃需要新建一維陣列的操作,優化到上面的**
如果即想 根據儲存前兩個狀態解析,又想儲存斐波那契數列 該怎麼做?
很簡單,新建乙個一維陣列,並且在獲得當前值時儲存進去即可
def
fib(n:
int)
->
int:
if n ==0:
return
0 prev, curr =0,
1 f_arr =
[prev, curr]
# 新建陣列,並且將初始值放入
for _ in
range
(n-1):
prev, curr = curr, prev+curr # 同時進行賦值
# 新增新的當前值
return curr # 返回當前值
在第一次編寫的時候(大概是大半年前),我還是個演算法小白,在學習途中一直模仿著別人的解法寫下筆記,如今回過頭來,我逐漸明白為什麼要去怎麼做,看著第一次寫下的筆記發現有著許多不足,於是我第二次修改編寫,在標題上加個2.0
斐波納契數列 維基百科↩︎
斐波拉契數列 演算法
斐波那契數列是一組第一位f1和第二位f2為1,從第三位開始,後一位是前兩位和的一組遞增數列fn fn 1 fn 2。那麼當n比較大時,fn也非常大,現在我們想知道,第n項,fn等於多少 如 輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,包含乙個整數,表示fn。樣例輸入10此時fibonacc 樣...
斐波拉契數列 Python
斐波拉契數列 這個數列從第三項開始,每一項都等於前兩項之和 題目內容 已知斐波拉契數列的前兩項都是1,我們定義求斐波拉契數列的第n項 n 50 的函式為fbnq,程式主體如下 n int input print fbnq n 請補充完成對fbnq函式的定義。輸入格式 共一行,為乙個正整數。輸出格式 ...
python數列 Python斐波拉契數列
1 2 4.古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後3 每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?4 兔子的規律為數列1,1,2,3,5,8,13,21.5 6 a,b 0,1 7 moon int input 請輸入月數 8 moon 5...