斐波那契数

import time

#递归算法求第n个斐波那契数,时间复杂度为O(2^n)
def f1(n):
  if n<=1:
    return n
  else:
    return f1(n-1)+f1(n-2)

#迭代算法求斐波那契数,时间复杂度为O(n),空间复杂度为O(1)
def f2(n):
  r1,r2,i=0,1,3
  if n<2:
    return n
  else:
    while i<=n:
      r=r1+r2
      r1,r2,i=r2,r,i+1
    return r
    
#利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数
def f3():
  r1,r2,r,count=int(0),int(1),int(1),2
  while r1<=r:
    r=r1+r2
    r1,r2,count=r2,r,count+1
  return count
#python支持大数计算,所以这里采取溢出方法算不出来
  
#采用递归算法,计算机在1,5,10,50秒内计算出的最大斐波那契数是第几个
def f4(t):
  t1,i=time.time(),3
  while time.time()-t1<=t:
    i=i+1
    f1(i)
  print(t,"秒内计算出的斐波那契数是第",i,"")
    
#采用迭代算法,计算机在1,5,10,50秒内计算出的最大斐波那契数是第几个
def f5(t):
  t1,count=time.time(),2
  r1,r2,r=0,1,1
  while time.time()-t1<=t:
    r=r1+r2
    r1,r2=r2,r
    count=count+1
  print(t,"秒内计算出的斐波那契数是第",count,"")
  return count

    
print("1:递归算法求第n个斐波那契数;\n2:迭代算法求第n个斐波那契数;\n3:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数;\n4:采用递归算法,计算机在1,5,10,50秒内计算出的最大斐波那契数是第几个;\n5:采用迭代算法,计算机在1,5,10,50秒内计算出的最大斐波那契数是第几个;\n6:退出;")
t=0
while t!=6:
  t=int(input("请输入选择的序号:"))
  if t==1:
    num=int(input("1、递归算法求第n个斐波那契数:请输入n:"))
    print("",num,"个斐波那契数是:",f1(num-1))
    continue
  elif t==2:
    num=int(input("2、迭代算法求第n个斐波那契数:请输入n:"))
    print("",num,"个斐波那契数是:",f2(num))
    continue
  elif t==3:
    print("利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第",f3(),"个斐波那契数")
    continue
  elif t==4:
    t=int(input("请输入秒数:"))
    f4(t)
    continue
  elif t==5:
    t=int(input("请输入秒数:"))
    f5(t)
    continue
  else:
continue

题目:

1:用递归和迭代算法求第n个斐波那契数;
2:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数;
3:采用递归和迭代算法,计算机在1,5,10,50秒内计算出的最大斐波那契数是第几个;

困惑解决:

其中寻找不超过环境支持的最大整数的斐波那契数:思路是将数字定义为int,当不断累加时会溢出,使得r变为负数,此时结束循环。但是Python支持大数计算,也就是当数字小于int范围时是int型,但当数字大于int时Python会自动把数字变为long型。由于Python自带大数计算,所以不存在溢出,只要内存足够

 

虽然递归算法简单,但是时间复杂度为O(2^n),递归树以2的n次方扩大,而且中间会有很大部分是重复计算,比较耗时

但是迭代算法时间复杂度是O(n),空间复杂度也只有O(1),所以比递归算法快很多

posted @ 2017-11-23 17:43  一枚小菜鸟  阅读(940)  评论(0编辑  收藏  举报