Python 演算法之 斐波拉契數列2 0

2021-10-08 19:14:32 字數 3352 閱讀 7139

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