在大学四年的时间,我一直对递归很是头疼,一直不懂其到底是怎么递归的,知道今天在公司看那几十万行的项目代码,一层一层的函数调用,突然灵光一现,终于悟出点递归的原理,下面我来分享一下我对递归的理解。
首先,我们要知道递归是什么?也许你会说递归就是自己调用自己的函数。是的,我曾经也是这么理解,甚至大学老师也是这么教的。但是现在我感觉这种说法很不好理解,我现在理解的递归其实就是一堆函数名一样,参数一样,返回值一样,甚至函数体也一样的函数在层层的调用,也就是说不要认为是函数调用自己,而是调用与自己一模一样的函数。懵了吗?呵呵,好吧,我用C++代码来具体解释一下以上几句话。
先看一个比较经典的递归函数算法,即计算n的阶乘!
#include <iostream>
using namespace std;
int recursive(int n); //声明递归函数
int main()
{
cout<<recursive(3)<<endl; //输出3的阶乘的值
return 0;
}
int recursive(int n) //递归算法
{
if(0 == n)
return 0;
if(1 == n)
return 1;
return (n*recursive(n-1));
}
以上递归算法,大家应该都见到过,而且也能猜出函数的作用,但是就是不知道到底如何递归的。这样,我将上边的算法改一下,也许你就明白什么意思了。
#include <iostream>
using namespace std;
int recursive_1(int n); //声明函数1
int recursive_2(int n); //声明函数2
int recursive_3(int n); //声明函数3
// ... ... //声明函数..
int recursive_n(int n); //声明函数n
int main()
{
cout<<recursive_1(3)<<endl; //输出3的阶乘的值
return 0;
}
int recursive_1(int n)
{
if(0 == n)
return 0;
if(1 == n)
return 1;
return (n*recursive_2(n-1));
}
int recursive_2(int n)
{
if(0 == n)
return 0;
if(1 == n)
return 1;
return (n*recursive_3(n-1));
}
int recursive_3(int n)
{
if(0 == n)
return 0;
if(1 == n)
return 1;
return (n*recursive_4(n-1));
}
//... ...
上述代码能看明白吧!(当然,上述代码运行会有点小Bug,相信你能找到,我只是想将递归分解,让大家看着更明白一些)
这回理解我为什么说递归就是调用和自己一模一样的函数了吧,我只是将递归每次调用的函数重新起了一个名,剩下的都是一样的!
再强调一遍,不要将递归看成是函数自己调用自己,将它每次调用的函数自己在心里或在草纸上重新起一个名(例如在后边加_1,_2,...),其实就是一个普通的函数调用。
提醒一下,递归的效率很低的,如果对效率要求较高的代码,是不建议使用递归的,一般递归都可以由循环来代替。当然,如果对效率要求不高,那么熟练的使用递归算法将会非常省时省力的(我是说在编码上省时省力,而不是编译哦)。
以上就是我对递归的感悟,希望能够对大家有所帮助。本人也是菜鸟一枚,如有不妥之处还请指出。