递归的性能测试笔记

递归的性能测试笔记

以下是三种方法实现依次打印斐波那契数列前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次循环,效率就更低了。

            递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快就溢出了。
    思考:这个极简的递归代码能否提高性能呢?
       答:不能,因为代码递归的深度加深,效率会直线降低,斐波那契数列又在外层套了循环,效率会更低。

    


猜你喜欢

转载自blog.csdn.net/yzzsjc2008/article/details/79953932