递归函数详解

原创 2013年12月05日 22:42:21

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

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

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

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


递归函数详解

介绍递归函数的原理
  • u010957494
  • u010957494
  • 2015年05月22日 07:58
  • 3561

php递归函数的理解

很多同学在学习递归函数的时候会感到头晕,无法搞清楚递归函数的原理和运行机制,本文将给大家详细讲解递归函数的运行机制和运用。那什么是递归函数呢?递归函数即为自调用函数,在函数体内直接或间接自己调用自己,...
  • DreamJourney
  • DreamJourney
  • 2016年03月08日 11:36
  • 905

写递归函数的正确思维方法

递归是编程中一个相对难以理解但是却又很重要的概念. 对于从命令式语言开始学习编程的程序员天生对此有理解缺陷, 而对于从类似C++这种对函数式编程范式不友好的语言开始学习编程的程序员就更加如此了.(比如...
  • vagrxie
  • vagrxie
  • 2013年01月05日 21:04
  • 67586

递归算法详解

递归算法详解         C语言通过运行时堆栈来支持递归的调用,在我们刚接触递归的时候,国内很多教材都采用求阶乘和菲波那契数列来描述该思想,就如同深受大家敬爱的国产的C语言程序设计,老谭也用...
  • effective_coder
  • effective_coder
  • 2013年04月06日 18:25
  • 15623

无聊的递归过程

编写递归函数的关键是退出递归函数的条件与递归的过程。更好诠释递归过程的是《C与指针》第7章 7.5.2节递归与迭代。 1 解递归 偶尔可能会遇到这样的题目,一个递归函数的调用叫咱求结果。假...
  • misskissC
  • misskissC
  • 2013年11月01日 17:13
  • 2312

C++函数之递归调用

在书上看到过归纳的使用递归调用解决问题的特点:       1,将原有的问题能够分解为一个新问题,而新问题又要用原有问题的解决方案,这便体现了递归。按照这一特点将问题分解下去,每次出现的新问题都是原问...
  • erlian1992
  • erlian1992
  • 2015年02月11日 18:21
  • 3423

递归算法讲解

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。     能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它...
  • u011225629
  • u011225629
  • 2015年08月15日 14:31
  • 1962

二叉树递归调用过程

二叉树是最常见最重要的数据结构之一,它的定义如下:   二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的、分别称为左子树和右子树的二叉树...
  • I_love_blog
  • I_love_blog
  • 2017年03月27日 14:48
  • 1239

shell浅谈之十函数

一、简介       Linux是一种用户控制的多作业操作系统,系统允许多个系统用户同时提交作业,而一个系统用户又可能用多个shell登录,每个系统用户可以用一个shell提交多个作业。了解Ba...
  • taiyang1987912
  • taiyang1987912
  • 2014年10月08日 19:19
  • 4913

java 递归详解

刚学java的时候通常难以理解递归程序设计的概念。递归思想之所以困难,原因在于它非常像是循环推理(circular reasoning)。它也不是一个直观的过程;当我们指挥别人做事的时候,我们极少会递...
  • qq_14996421
  • qq_14996421
  • 2016年04月29日 11:50
  • 1176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归函数详解
举报原因:
原因补充:

(最多只允许输入30个字)