python實現斐波那契數列
阿新 • • 發佈:2020-07-26
首先想到的是用遞迴來解決
求100內的斐波那契數列:
def diGui(num=100): a,b = 0,1 # 為了方便看列印,我就用list存一下 lit = [] while a < num: # print(a) lit.append(a) a, b = b,a+b print(lit) diGui() # 列印輸出為 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] # 求1000內的 diGui(1000) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
遞迴是比較容易解決,但是這個對記憶體很不友好,要是後面求10000,100000,甚至更大的呢!
所以就想到可以用python的生成器,如果一個函式中有yield關鍵字,那他就是一個生成器(generator).
import sys # 這裡其實和上面的遞迴寫法很類似,只需要把print(a)換成yeild就行 def generator(num=100): a,b = 0,1 while a < num: # print(a) yield a a, b = b,a+b # 注意:這裡的g是一個生成器物件 <class 'generator'> g = generator() print(type(g)) # 然後我呼叫next()方法取值 while True: print(next(g)) # 重複呼叫next()方法,但是這裡會拋異常,因為重複呼叫next()方法,直到結束 Traceback (most recent call last): File "D:/xxxxxxx.py", line 60, in <module> print(next(g)) StopIteration <class 'generator'> 0 1 1 2 3 5 8 13 21 34 55 89 Process finished with exit code 1
# 所以我們可以try一下,捕獲它,讓程式正常結束
while True:
try:
# print(next(g))
n = next(g)
if n < 100:
print(n)
except StopIteration:
print('沒有了!')
sys.exit() # sys是python的模組,需要import
# 最後輸出
0
1
1
2
3
5
8
13
21
34
55
89
沒有了!