斐波那契数列
题目:斐波那契数列,首项是1,1,之后每项是前两项之和
解题思路
这个用函数实现很简单,但是每次的打印内容都占用内存,所以可以使用生成器去完成,后来又写了个递归。对照一下
代码实现(python)
#斐波那契数列函数实现
def fib(max):
#初始化下标,数列前两项
n,a,b=0,0,1
while n < max:
a,b = b,a+b
print(b)
n=n+1
return 'done'
#斐波那契数列生成器实现
def fib_generator(max):
n,a,b = 0,0,1
while n < max:
a,b = b,a+b
yield b
n = n + 1
return "done"
#斐波那契数列递归实现
def fib_recurse(i):
if i < 2:
return 1
return fib_recurse(i-2) + fib_recurse(i-1)
if __name__ == "__main__":
fib(5)
gen = fib_generator(5)
#拿不到函数返回值的调用生成器方式 for循环
for x in gen:
print(x)
#可以拿到函数返回值的调用生成器方式 while循环加异常捕捉
while True:
try:
x = next(gen)
print(x)
except StopIteration as e:#生成器函数的返回值放在StopIteration的value中
print("生成器函数返回值:",e.value)
break
for i in range(5):
print(fib_recurse(i))
解题总结
1.其实写这个主要是为了实现生成器方式,但是在这个过程中需要注意的一点就是,如果生成器函数有返回值,那就需要使用while循环+异常捕捉的方式,因为当发生StopIteration异常的时候,就达到了生成器的末尾,也就是return,此时通过value可以得到;如果不需要获取到返回值,就直接使用for循环就好
2.可以使用for循环的就两类,一类是集合类对象:list,turple,dic,set,str,一类就是生成器函数和生成器表达式,但是集合类对象可以使用iter()方法转为生成器