python实现斐波拉契数列的算法时间复杂度分析

方案1:通过递归的方案实现,代码如下:

#定义递归函数
def feb(n):
    # a = 0
        if n > 0:
            if n == 1 or n ==2:
                return 1
            else:
                return feb(n-1)+feb(n-2)
        else:
            print("you must input a number >= 0")

#通过for循环进行打印
def febPrint(n):
    for i in range(1,n+1):
        print(feb(i))
febPrint(40)

#按照需要打印的位置进行打印
a=feb(40)
print(a)

方案2:通过while循环进行打印

#while循环方案
def feb1(n):
    i=1
    a,b = 0,1
    while i<=n:
        a,b = b,a+b
        print(a,end=' ')
        i+=1

#按照顺序打印
feb1(50)

惊奇发现:我选择的是打印第40个数字,两种方案在执行过程发现递归的过程执行非常缓慢,对比while循环完全是龟速,就像是O(n**2)对比O(1)这样大的差距

1)递归模式下时间消耗:33.36s

2)while循环模式下时间消耗:0.00035554s,时间上接近与0消耗。

尝试从时间复杂度的角度分析,我也不确定对不对,欢迎指正:

1)递归场景下,feb(40)=feb(39)+feb(38)=feb(38)+feb(37)+feb(36)+feb(35)=。。。这样持续的递归,从计算过程来看,递归的拆解过程会是1+2+2*2+2*2*2...,也就是不考虑外围赋值等计算的情况下,相当于\sum_{0}^{39}2^{n}次的计算。

2)而while循环场景,仅相当于按序数的顺序尽量累加计算,如果不考虑打印等其他外围命令,就相当于1+2+2+...+2,39*2+1=79次计算

以上来两种情况来看,运行的时间差距如此巨大是完全正常的,所以所即便是一个简单的斐波拉契数列,要选好合适的算法,才能达到最优计算逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值