关闭

递归函数详解

标签: 递归算法c++编码
461人阅读 评论(0) 收藏 举报
分类:

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

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

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

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:850次
    • 积分:23
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档