递归的性能测试笔记
以下是三种方法实现依次打印斐波那契数列前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次循环,效率就更低了。
思考:这个极简的递归代码能否提高性能呢?
答:不能,因为代码递归的深度加深,效率会直线降低,斐波那契数列又在外层套了循环,效率会更低。