• 中文
    • English
  • 注册
  • 查看作者
  • 关于递归的错误总结

    一.  前言

    今天学到数据结构三节:栈与递归,一看递归这两个字,想起了大一上学期初学递归时的恐惧

    自己逻辑思维一向不好,当时绕了好久才弄明白,弄明白后又发现递归是如此的简单

    于是打开CodeBlocks,想不复习的情况下自己实现一下递归,没想到一写,问题出来了

    二.  错误写法

    按照自己的思路,递归不就是一直调用自己吗,直接一个sum一直阶乘下去不就OK了

    于是写出了下面这个程序:

    #include <iostream>
    using namespace std;
    int recursion(int n)
    {
        static int sum = 1;
        int b;
        if(n == 1)
        {
            b = sum;
            sum = 1;
    
            return b;
    
    
        }
        else
        {
            sum = sum *(n--);
            recursion(n);
        }
    }
    
    int main()
    {
        int n = 0;
        cout << "我们可以计算n的阶乘,请输入n" << endl;
        cin >> n;
        cout << n << "的阶乘为:" << recursion(n) << endl;
    
        return 0;
    }
    
    输入:
    9
    输出:
    9的阶乘为:362880

     

    一看结果正确,很开心,但又隐约感觉不太对:

    因为这里自己使用了static来定义sum

    要知道,我们日常的编程中,应尽量减少static的使用的:

    一是因为声明一个静态变量的时候就会开辟一块静态内存,需要在类的生命周期结束的结束的时候内存才会释放,而一个类的生命周期一般会很长,基本上会伴随应用一直存在,除非手动消除

    二是static会在一定程度上破坏程序的封装性,使后期的维护难度加大

    再者将sum定义为static,其值不会自动清空,如果在main函数里调用两次recursion函数,结果会累积

    三.  正确写法

    #include <iostream>
    using namespace std;
    int recursion(int n)
    {
        int sum = 1;
        if(n == 1)
        {
            return 1;
        }
        else
        {
            return sum = n * recursion(n - 1);
        }
    }
    
    int main()
    {
        int n = 0;
        cout << "我们可以计算n的阶乘,请输入n" << endl;
        cin >> n;
        cout << n << "的阶乘为:" << recursion(n) << endl;
    
        return 0;
    }

     

  • 0
  • 0
  • 0
  • 3.9k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: