一. 前言
今天学到数据结构三节:栈与递归,一看递归这两个字,想起了大一上学期初学递归时的恐惧
自己逻辑思维一向不好,当时绕了好久才弄明白,弄明白后又发现递归是如此的简单
于是打开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; }
请登录之后再进行评论