斐波那契數列的多種解法 遞迴 動態規劃

2021-10-20 20:49:36 字數 1571 閱讀 6894

斐波那契數列:

0、1、1、2、3、5、8、13、21、34

遞推的方法定義:f(0)=0,f(1)=1, f(n)=f(n - 1)+f(n - 2)(n ≥ 2,n ∈ n*)

# -*- coding: utf-8 -*-

"""created on wed mar 3 10:58:27 2021

@author: dujidan

"""from collections import defaultdict

# 遞迴解法

deffib

(n):

if n <1:

return

0if n ==

1or n ==2:

return

1return fib(n -1)

+ fib(n -2)

# 帶備忘錄的遞迴解法

deffib

(n):

if n <1:

return

0 meno_dict =

return helper(meno_dict, n)

defhelper

(meno_dict, n)

:if n ==

1or n ==2:

return

1if n in meno_dict.keys():

return meno_dict[n]

else

: meno_dict[n]

= helper(meno_dict, n -1)

+ helper(meno_dict, n -2)

return meno_dict[n]

# 動態規劃一般都脫離了遞迴, 由迴圈迭代完成計算

# 陣列迭代解法 動態規劃

deffib

(n):

dp_dict = defaultdict(

int)

dp_dict[1]

=1dp_dict[2]

=1for i in

range(3

, n+1)

: dp_dict[i]

= dp_dict[i -1]

+ dp_dict[i -2]

return dp_dict[n]

# 當前狀態只和之前的兩個狀態有關, 其實並不需要那麼個 dp table 來儲存所有的狀態, 只要想辦法儲存之前的兩個狀態

# 所以, 可以進一步優化, 把空間複雜度降為 o(1)

deffib

(n):

if n ==

1or n ==2:

return

1 prev =

1; curr =

1for i in

range(3

, n+1)

: sum_num = prev + curr

prev = curr

curr = sum_num

return curr

print

(fib(

200)

)

斐波那契數列解法

方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...

斐波那契數列解法

1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...

斐波那契數列的遞迴與非遞迴解法

lintcode第366題 斐波納契數列 中文english 查詢斐波納契數列中第 n 個數。所謂的斐波納契數列是指 前2個數是 0 和 1 第 i 個數是第 i 1 個數和第i 2 個數的和。斐波納契數列的前10個數字是 0,1,1,2,3,5,8,13,21,34 樣例 樣例 1 輸入 1 輸出...