python 单递归(线性递归)完成斐波拉契数列
用递归实现斐波拉契数列是非常简单的。,但是如果使用了双递归实现那么执行效率将会直线下降:
首先双递归实现代码如下:
def fib(n):
'''
双递归实现
输入的n必须为正整数
'''
if n < 3:
return 1
else:
return fib(n - 1) + fib(n - 2)
双递归会导致运算结构呈现树状结构(我姑且这样称为),重复许多计算。下面是单递归实现:
def fib(n):
if n < 3:
return 1, 1
else:
a, b = fib(n - 1) # 最重要一步,每次取两个值
return a + b, a
这样虽然可以极大提高计算效率,但是有个小问题,他的返回值是两个值,一般不符合我们的使用。因此我们可以使用装饰器来改进,完整代码:
def dec_fib(func):
tmp = None
def dec_inner(n):
nonlocal tmp
if tmp is None:
tmp = 0 # 用来确认第一次调用fib().
if n > 0 and type(n) is int:
return func(n)[0]
else:
print('输入的数必须为正整数!')
else:
return func(n)
return dec_inner
@dec_fib
def fib(n):
if n < 3:
return 1, 1
else:
a, b = fib(n - 1) # 最重要一步,每次取两个值
return a + b, a
这样即对输入的数做了约束,使用了递归完成,并且这种递归执行效率极高: