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;
    }
    
    /*
    递归的定义
    在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用自己的函数,称做递归函数。
    当然,写递归程序最怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再
    引用自身而是返回值退出。
    对比了两种实现斐波那契的代码。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归会使程序的结构更清晰
    更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。迭代则不需要
    反复调用函数和占用额外的内存。因此我们应该视不同情况选择不同的代码实现方式。
    
    说了这么多递归和栈有什么关系呢?
    前面我们已经看到递归是如何执行它的前行和退回阶段的。递归过程退回的顺序是他前行顺序的逆序。在退回过程中,可能要执行
    某些动作,包括恢复在前行过程中存储起来的某些数据。
    这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈这样的数据结构,因此,编译器
    使用栈实现递归就没什么好惊讶的了。
    简单来说,就是在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、
    参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复调用的状态。
    当然,对于现在的高级语言,这样的递归问题是不需要用户来管理这个栈的,一切由系统代劳了。
    */
  • 相关阅读:
    【转载】Python中如何高效实现两个字典合并,三种方法比较。
    闭包在python中的应用,translate和maketrans方法详解
    python中的多线程【转】
    二叉树非递归遍历方法小结
    Mac OS X 10.9 编译C++11
    LeetCode--Reverse Words in a String
    LeetCode ---Anagrams() 详解
    KMP算法的代码实现
    Mac OS10.9 下python开发环境(eclipse)以及自然语言包NLTK的安装与注意
    秋季面试准备(1)——atoi的实现以及C++库函数stringstream
  • 原文地址:https://www.cnblogs.com/go-ahead-wsg/p/13199000.html
Copyright © 2011-2022 走看看