求解第N斐波那契数列
1,1,2,3,5,8,13。。。
1,重复赋值发
a,b = 1,1
index = 0
n = 0
while True:
if n == 10:
break
index += 1
print('这是第{}个斐波那契数:{}'.format(index,a))
a,b = b,a+b
n += 1
2,递归函数法(双递归)
def func(n):
# 求解第N个斐波那契数
if n == 1 or n == 2:
return 1
else:
ret = func(n - 1) + func(n - 2)
return ret
3,递归实现优化(双返回值)
def fib(n,l=[0]):
l[0] += 1#列表是可变的,因此即使层层递归使用的仍是同一列表
if n == 2:
l[0] -= 1
return 1, 1
else:
a, b = fib(n - 1)
l[0] -= 1
if l[0]==0:
return b+a
return b, b + a
0-->1-->2-->3-->4-->5.。。。再进行返回,5-->4-->3-->2-->1-->0 当最后一次返回最终结果时,只有一个数而不是一个元组
4,装饰器+递归
由于使用双递归,使得计算更复杂进行了很多的重复计算。因此想到增加一个字典缓存区:dic ={} 让计算过得值存到字典中
def wrapper(fib):
dic = {}
def inner(*args, **kwargs):
if args not in dic:
dic[args] = fib(*args, **kwargs)
return dic[args]
return inner
@wrapper
def func(n):
# 求解第N个斐波那契数
if n == 1 or n == 2:
return 1
else:
ret = func(n - 1) + func(n - 2)
return ret