最近在學寫程式
剛好遇到費氏數列的問題 覺得很有趣 就記錄下來
費氏數列的定義應該不用多說
$$F_0 = 0, F_1 = 1$$
$$
F_n = F_{n-1} + F_{n-2}
$$
那扣要怎麼寫呢
最直觀當然就是照著定義寫遞迴了
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
return fib(n-1) + fib(n-2)
但是這樣數字一大就會很慢 為什麼呢?
因為很多數字都重複算了
例如算 fib(6) 的時候 由下圖可以看到 f(4) 被算了兩次 f(3) 被算了三次
解決辦法就是把算的結果記起來 就不用再算一次了
可以這樣寫
from functools import cache
@cache
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
return fib(n-1) + fib(n-2)
不過這樣浪費記憶體空間
要解決的話可以寫迴圈版的
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
真是太神奇了 傑克
又長姿勢了呢
Ref
Recursive Fibonnaci Method Explained | by Bennie van der Merwe | Launch School | Medium