python实现斐波那契数列
首先想到的是用递归来解决
求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 没有了!