递归的性能测试
以下是三种方法实现依次打印斐波那契数列前N项的值并分别测试各种实现代码的性能。
题目:依次打印斐波那契数列(Fibonacci number)前N项的值:
# 如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式:F(n)=F(n-1)+F(n-2)
# F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)
【实现方法1:for循环】:依次打印斐波那契数列前N项的值:
代码如下:
import datetime
start = datetime.datetime.now()
pre = 0
cur = 1 #No.1
dight = int(input('please enter a number(dight):'))
print(cur,end=' ')
for i in range(dight-1):
pre , cur = cur, pre + cur
print(cur,end=' ')
stop = (datetime.datetime.now() - start).total_seconds()
print('\n','program run time is :{}'.format(stop))
效果如图:
【实现方法2:递归实现,代码最少,效率低】:依次打印斐波那契数列前N项的值:
代码如下:
start2 = datetime.datetime.now()
dight2 = int(input('please enter a number(dight2):'))
def fib(dight2):
return 1 if dight2<2 else fib(dight2-1)+fib(dight2-2) #三目运算式。
# dight2 = int(input('please enter a number(dight2):'))
for i in range(dight2): #for循环调用fib函数。
print(fib(i),end=' ')
fib(dight2)
stop2 = (datetime.datetime.now() - start2).total_seconds()
print('\n','program two run time is :{}'.format(stop2))
效果如图:
【实现方法3:递归实现,改进代码,相对来比较效率高】:依次打印斐波那契数列前N项的值:
代码如下:
start3 = datetime.datetime.now()
pre = 0
cur = 1
dight3 = int(input('please enter a number(dight3):'))
print(cur,end = ' ')
def fib(dight3,pre =0,cur =1):
pre, cur = cur ,pre+cur
print(cur,end= ' ')
if dight3==2:
return
fib(dight3-1,pre,cur)
fib(dight3)
stop3 = (datetime.datetime.now() - start3).total_seconds()
print('\n','program run time is :{}'.format(stop3))
效果如图:
性能总结:
for 循环对比来说,效率最高, 代码2是通过递归正常,代码量少,但执行效率很低,随着递归深度加深,效率更低,
代码3是通过递归调用函数自身改进代码,效率相对来说,提高了不少,但随着递归深度加深,效率会下降很多。
递归的性能:
循环稍微复杂一些,但是只要不是死循环,可以多次迭代直至算出结果。
fib函数代码极简易懂,但是只能获取到最外层的函数调用,内部递归结果都是中间结果。而且给定一个n都有要进行近
2n次递归,深度越深,效率越低。为了获取斐波那契数列需要处面在套一个n次循环,效率就更低了。
递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快就溢出了。
思考:这个极简的递归代码能否提高性能呢?
答:不能,因为代码递归的深度加深,效率会直线降低,斐波那契数列又在外层套了循环,效率会更低。