方案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...,也就是不考虑外围赋值等计算的情况下,相当于次的计算。
2)而while循环场景,仅相当于按序数的顺序尽量累加计算,如果不考虑打印等其他外围命令,就相当于1+2+2+...+2,39*2+1=79次计算
以上来两种情况来看,运行的时间差距如此巨大是完全正常的,所以所即便是一个简单的斐波拉契数列,要选好合适的算法,才能达到最优计算逻辑。