递归函数详解

在大学四年的时间,我一直对递归很是头疼,一直不懂其到底是怎么递归的,知道今天在公司看那几十万行的项目代码,一层一层的函数调用,突然灵光一现,终于悟出点递归的原理,下面我来分享一下我对递归的理解。

首先,我们要知道递归是什么?也许你会说递归就是自己调用自己的函数。是的,我曾经也是这么理解,甚至大学老师也是这么教的。但是现在我感觉这种说法很不好理解,我现在理解的递归其实就是一堆函数名一样,参数一样,返回值一样,甚至函数体也一样的函数在层层的调用,也就是说不要认为是函数调用自己,而是调用与自己一模一样的函数。懵了吗?呵呵,好吧,我用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,...),其实就是一个普通的函数调用。

提醒一下,递归的效率很低的,如果对效率要求较高的代码,是不建议使用递归的,一般递归都可以由循环来代替。当然,如果对效率要求不高,那么熟练的使用递归算法将会非常省时省力的(我是说在编码上省时省力,而不是编译哦)。

以上就是我对递归的感悟,希望能够对大家有所帮助。本人也是菜鸟一枚,如有不妥之处还请指出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值