利用Python實現(xiàn)斐波那契數(shù)列的5種方法全解析
引言:為什么斐波那契是編程“入門必修課”?
斐波那契數(shù)列(Fibonacci Sequence)是一個經(jīng)典的數(shù)學(xué)序列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
定義為:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)
它不僅是數(shù)學(xué)之美,更是編程思維的試金石。
掌握它的多種實現(xiàn)方式,意味著你真正理解了:
- 循環(huán)與遞歸
- 時間復(fù)雜度與空間復(fù)雜度
- 記憶化與動態(tài)規(guī)劃
- 生成器與內(nèi)存優(yōu)化
方法一:【最優(yōu)】循環(huán)迭代法(推薦級)
這是最實用、最高效的寫法,也是你寫的版本!
def fib_iter(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a優(yōu)點:
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1)
- 代碼簡潔,邏輯清晰
- 支持大數(shù)計算(如 fib_iter(10000) 不會爆棧)
使用建議:
- 日常使用首選!
- 適用于絕大多數(shù)場景,尤其是 n 較大時
方法二:【不推薦】樸素遞歸法(反面教材)
def fib_recursive(n):
if n <= 1:
return n
return fib_recursive(n - 1) + fib_recursive(n - 2)問題:
- 時間復(fù)雜度:O(2^n) —— 指數(shù)級增長,效率極低
- 空間復(fù)雜度:O(n) —— 遞歸深度
- 存在大量重復(fù)計算(如 fib_recursive(5) 會重復(fù)計算 fib_recursive(3) 兩次)
結(jié)果:
- n > 30 就明顯卡頓
- 僅用于理解遞歸思想,不要在生產(chǎn)環(huán)境使用
方法三:【推薦】記憶化遞歸(動態(tài)規(guī)劃思想)
from functools import lru_cache
@lru_cache(maxsize=None)
def fib_memo(n):
if n <= 1:
return n
return fib_memo(n - 1) + fib_memo(n - 2)優(yōu)點:
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(n)
- 利用緩存避免重復(fù)計算
- 代碼接近數(shù)學(xué)定義,可讀性強(qiáng)
適用場景:
- 學(xué)習(xí)“記憶化”、“動態(tài)規(guī)劃”的絕佳案例
- 適合中等規(guī)模數(shù)據(jù)(如 n < 10?)
方法四:【推薦】生成器版本(內(nèi)存友好)
def fib_generator(n):
a, b = 0, 1
count = 0
while count < n:
yield a
a, b = b, a + b
count += 1
# 使用方式
for num in fib_generator(10):
print(num, end=' ')
# 輸出:0 1 1 2 3 5 8 13 21 34優(yōu)點:
- 不一次性生成所有數(shù),節(jié)省內(nèi)存
- 支持 next() 逐個獲取
- 適合處理大數(shù)據(jù)或無限序列
適用場景:
- 處理大量數(shù)據(jù)(如前 100 萬個斐波那契數(shù))
- 流式處理、實時輸出
方法五:【高級】矩陣快速冪(超快!)
適用于:求第百萬個斐波那契數(shù) 的極致性能需求。
def matrix_multiply(A, B):
return [
[A[0][0]*B[0][0] + A[0][1]*B[1][0], A[0][0]*B[0][1] + A[0][1]*B[1][1]],
[A[1][0]*B[0][0] + A[1][1]*B[1][0], A[1][0]*B[0][1] + A[1][1]*B[1][1]]
]
def matrix_power(mat, n):
if n == 1:
return mat
if n % 2 == 0:
half = matrix_power(mat, n // 2)
return matrix_multiply(half, half)
else:
return matrix_multiply(mat, matrix_power(mat, n - 1))
def fib_fast(n):
if n <= 1:
return n
base_matrix = [[1, 1], [1, 0]]
result_matrix = matrix_power(base_matrix, n)
return result_matrix[0][1]優(yōu)點:
- 時間復(fù)雜度:O(log n)
- 極速計算,適合超大數(shù)
適用場景:
- 求第 10? 個斐波那契數(shù)
- 算法競賽、高性能計算
性能對比總結(jié)表
| 方法 | 時間復(fù)雜度 | 空間復(fù)雜度 | 是否推薦 | 適用場景 |
|---|---|---|---|---|
| 循環(huán)迭代 | O(n) | O(1) | ??? 強(qiáng)烈推薦 | 大多數(shù)情況 |
| 樸素遞歸 | O(2?) | O(n) | ? 不推薦 | 教學(xué)演示 |
| 記憶化遞歸 | O(n) | O(n) | ? 推薦 | 學(xué)習(xí)動態(tài)規(guī)劃 |
| 生成器 | O(n) | O(1) | ? 推薦 | 大數(shù)據(jù)/流式處理 |
| 矩陣快速冪 | O(log n) | O(log n) | ? 高級使用 | 超大數(shù)計算 |
最佳實踐建議
- 日常開發(fā) → 用循環(huán)迭代法(你寫的那個)
- 學(xué)習(xí)算法 → 用記憶化遞歸
- 處理大數(shù)據(jù) → 用生成器
- 追求極致性能 → 用矩陣快速冪
擴(kuò)展練習(xí)題(挑戰(zhàn)一下)
- 寫一個函數(shù),返回前 n 個斐波那契數(shù)的列表(用生成器)
- 寫一個函數(shù),判斷某個數(shù)是否為斐波那契數(shù)
- 畫出斐波那契數(shù)列的圖形(用 matplotlib)
- 模擬“兔子繁殖”問題(經(jīng)典故事背景)
附錄:一鍵運行腳本模板
"""
【推薦】斐波那契函數(shù)合集(可直接復(fù)制使用)
"""
from functools import lru_cache
# 1. 循環(huán)迭代(最優(yōu))
def fib_iter(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
# 2. 記憶化遞歸(推薦學(xué)習(xí))
@lru_cache(maxsize=None)
def fib_memo(n):
if n <= 1:
return n
return fib_memo(n - 1) + fib_memo(n - 2)
# 3. 生成器(內(nèi)存友好)
def fib_gen(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
# 測試
if __name__ == "__main__":
print("前10個斐波那契數(shù):")
print(list(fib_gen(10)))以上就是利用Python實現(xiàn)斐波那契數(shù)列的5種方法全解析的詳細(xì)內(nèi)容,更多關(guān)于Python實現(xiàn)斐波那契數(shù)列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用pyplot.matshow()函數(shù)添加繪圖標(biāo)題
這篇文章主要介紹了使用pyplot.matshow()函數(shù)添加繪圖標(biāo)題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

