• 中文
    • 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.7k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: