zoukankan      html  css  js  c++  java
  • 8.栈的应用-----递归(斐波那契数列)

    /*4.8 栈的应用-递归*/
    /*
        斐波那契数列
    说 如果兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。假设所有兔都不死,那么一年以后可以繁殖多少对兔子呢?
    我们拿新出生的一对小兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔子数共有两对;三个月以后,老兔子又生下
    一对,因为小兔子没有繁殖能力,所以一共是三对......依此类推四个月以后是5对...五个月之后是8对
    兔子的对数 按月排依次是1,1,2,3,5,8,13.....构成一个序列,有十分明显的特点
    
    */

     

     我们用数学函数定义就是:

    $F(n) =left{ egin{array}{ll} 0, & extrm{当n=0}\ 1, & extrm{当n=1}\ F(n-1)+F(n-2),  & extrm{当n>1} end{array} ight.$

    */
    //假设我们需要打印出前40位斐波那契数列数。代码如下:
    int main()
    {
        int i;
        int a[40];
        a[0] = 0;
        a[1] = 1;
        printf("%d", a[0]);
        printf("%d", a[1]);
        for (i=2; i<40; i++)
        {
            a[i] = a[i-1] + a[i-2];
            printf("%d", a[i]);
        }
        return 0;
    }
    
    //斐波那契数列的递归函数
    int Fbi(int i)
    {
        if(i < 2)
            return i == 0 ? 0 : 1;
        //这里Fbi就是函数自己,它在调用自己
        return Fbi(i-1) +Fbi(i-2);
    }
    int main()
    {
        int i;
        for (i=0; i < 40; i++)
            printf("%d", Fbi(i));
        return 0;
    }
    
    /*
    递归的定义
    在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用自己的函数,称做递归函数。
    当然,写递归程序最怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再
    引用自身而是返回值退出。
    对比了两种实现斐波那契的代码。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归会使程序的结构更清晰
    更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。迭代则不需要
    反复调用函数和占用额外的内存。因此我们应该视不同情况选择不同的代码实现方式。
    
    说了这么多递归和栈有什么关系呢?
    前面我们已经看到递归是如何执行它的前行和退回阶段的。递归过程退回的顺序是他前行顺序的逆序。在退回过程中,可能要执行
    某些动作,包括恢复在前行过程中存储起来的某些数据。
    这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈这样的数据结构,因此,编译器
    使用栈实现递归就没什么好惊讶的了。
    简单来说,就是在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、
    参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复调用的状态。
    当然,对于现在的高级语言,这样的递归问题是不需要用户来管理这个栈的,一切由系统代劳了。
    */
  • 相关阅读:
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    OA办公系统 Springboot Activiti6 工作流 集成代码生成器 vue.js 前后分离 跨域
    java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM
    最后阶段总结
    第二阶段学习总结
    第一阶段学习总结
  • 原文地址:https://www.cnblogs.com/go-ahead-wsg/p/13199000.html
Copyright © 2011-2022 走看看