python学习031-----python之递归(二):斐波那契数列的实现(递归/非递归方法效率比较)

斐波那契数列:
1     2     3     4     5     6     7     8     9     10   ...
1     1     2     3     5     8    13   21   34    55   ...

1.用迭代实现斐波那契数列(非递归方法)

def fab(n):   
    n1 = 1      
    n2 = 1      
    n3 = 1     

    if n < 1:   
        print('输入有误!')
    
    while (n-2) > 0:    
        n3 = n2 + n1   #第三项为前两项和
        n1 = n2            #计算完,整体后移,准备计算下一项  
        n2 = n3            
        n -= 1              

    return n3            

a = int(input('请输入要计算的斐波那契项数:'))
result = fab(a)
print('第%d项斐波那契数为%d' % (a, result))

2.递归方法
 
原理:(树形结构图)
                                                      Fab(5)
                          Fab(4)                     +                     Fab(3)               
              Fab(3)     +      Fab(2)         +          Fab(2)    +      Fab(1)
      Fab(2)+Fab(1)+Fab(1)+Fab(0)  +  Fab(1)+Fab(0)     
Fab(1)+Fab(0)

def fab1(n):
    if n < 1:
        print('输入错误!')

    if n == 1 or n == 2:
        return 1               #如果求的是第一或者第二项,直接结果为1
    else:
        return fab1(n-1) + fab1(n-2)

a = int(input('请输入要计算的斐波那契项数:'))
result = fab(a)
print('第%d项斐波那契数为%d' % (a, result))

经过比较,递归方法简单,容易理解,但是会浪费大量的CPU资源,计算时间也比非递归方法长了相当多。非递归方法无非就是代码稍微复杂一点点,但是计算时间却很短,也几乎不怎么占用CPU资源。这就是为什么不提倡使用递归方法的原因。
 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【问题描述】 【问题描述】编写函数f,功能是用归的方法斐波数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波数列的第n项,并在主函数中输出。 斐波数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用归的方法斐波数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波数列的第n项,并在主函数中输出。 斐波数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用归的方法斐波数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波数列的第n项,并在主函数中输出。 斐波数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 【问题描述】编写函数f,功能是用归的方法斐波数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波数列的第n项,并在主函数中输出。 斐波数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8 斐波数列:1,1,2,3,5,8,13,21…… 【输入形式】3 【输出形式】2 【样例输入】6 【样例输出】8
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值