77问答网
所有问题
什么是递归调用,详细点
如题所述
举报该问题
推荐答案 推荐于2016-06-06
C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。
许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。
这里有一个简单的程序,可用于说明递归。程序的目的是把一个整数从二进制形式转换为可打印的字符形式。例如:给出一个值4267,我们需要依次产生字符‘4’,‘2’,‘6’,和‘7’。就如在printf函数中使用了%d格式码,它就会执行类似处理。
我们采用的策略是把这个值反复除以10,并打印各个余数。例如,4267除10的余数是7,但是我们不能直接打印这个余数。我们需要打印的是机器字符集中表示数字‘7’的值。在ASCII码中,字符‘7’的值是55,所以我们需要在余数上加上48来获得正确的字符,但是,使用字符常量而不是整型常量可以提高程序的可移植性。‘0’的ASCII码是48,所以我们用余数加上‘0’,所以有下面的关系:
‘0’+ 0 =‘0’
‘0’+ 1 =‘1’
‘0’+ 2 =‘2’
...
从这些关系中,我们很容易看出在余数上加上‘0’就可以产生对应字符的代码。接着就打印出余数。下一步再取商的值,4267/10等于426。然后用这个值重复上述步骤。
这种处理方法存在的唯一问题是它产生的数字次序正好相反,它们是逆向打印的。所以在我们的程序中使用递归来修正这个问题。
我们这个程序中的函数是递归性质的,因为它包含了一个对自身的调用。乍一看,函数似乎永远不会终止。当函数调用时,它将调用自身,第2次调用还将调用自身,以此类推,似乎永远调用下去。这也是我们在刚接触递归时最想不明白的事情。但是,事实上并不会出现这种情况。
这个程序的递归实现了某种类型的螺旋状while循环。while循环在循环体每次执行时必须取得某种进展,逐步迫近循环终止条件。递归函数也是如此,它在每次递归调用后必须越来越接近某种限制条件。当递归函数符合这个限制条件时,它便不在调用自身。
在程序中,递归函数的限制条件就是变量quotient为零。在每次递归调用之前,我们都把quotient除以10,所以每递归调用一次,它的值就越来越接近零。当它最终变成零时,递归便告终止。
/*接受一个整型值(无符号0,把它转换为字符并打印它,前导零被删除*/
#include <stdio.h>
int binary_to_ascii( unsigned int value)
{
unsigned int quotient;
quotient = value / 10;
if( quotient != 0)
binary_to_ascii( quotient);
putchar ( value % 10 + '0' );
}
递归是如何帮助我们以正确的顺序打印这些字符呢?下面是这个函数的工作流程。
1. 将参数值除以10
2. 如果quotient的值为非零,调用binary-to-ascii打印quotient当前值的各位数字
3. 接着,打印步骤1中除法运算的余数
注意在第2个步骤中,我们需要打印的是quotient当前值的各位数字。我们所面临的问题和最初的问题完全相同,只是变量quotient的值变小了。我们用刚刚编写的函数(把整数转换为各个数字字符并打印出来)来解决这个问题。由于quotient的值越来越小,所以递归最终会终止。
一旦你理解了递归,阅读递归函数最容易的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。如果你的每个步骤正确无误,你的限制条件设置正确,并且每次调用之后更接近限制条件,递归函数总是能正确的完成任务。
但是,为了理解递归的工作原理,你需要追踪递归调用的执行过程,所以让我们来进行这项工作。追踪一个递归函数的执行过程的关键是理解函数中所声明的变量是如何存储的。当函数被调用时,它的变量的空间是创建于运行时堆栈上的。以前调用的函数的变量扔保留在堆栈上,但他们被新函数的变量所掩盖,因此是不能被访问的。
当递归函数调用自身时,情况于是如此。每进行一次新的调用,都将创建一批变量,他们将掩盖递归函数前一次调用所创建的变量。当我追踪一个递归函数的执行过程时,必须把分数不同次调用的变量区分开来,以避免混淆。
温馨提示:答案为网友推荐,仅供参考
当前网址:
http://77.wendadaohang.com/zd/YvGGYqWYp88NN3I38vp.html
其他回答
第1个回答 2014-12-04
简单的来说就是自己调自己。
比如斐波那列数的问题:1,1,2,3,5 ……
即一个数等于它前两个数之和,就可以这样做
int fun(n)
{
if (n <= 2) return 1;
else return fun(n - 1) + (n - 2);
}
在fun内,调用fun自身。递归必须有终点,不能无限制的调下去,否则会栈溢出。
相似回答
什么是递归调用,详细点
答:
C通过运行时堆栈支持递归函数的实现。
递归函数就是直接或间接调用自身的函数
。许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计...
能
详细点
说明下
递归
吗,最好有现实例子说明
答:
递归,简单的说就是自己调用自己,执行递归函数降反复调用其自身,每调用一次就进入新的一层
。例如,有函数f如下。int f(int x){ int y;z=f(y);return z;} 这个函数是一个递归函数,但是运行该函数将无休止的调用自身,这当然是不正确的,在此只是给你举个简单的例子而已。为了防止调用无休止的...
递归是什么
?要
详细
解释
答:
递归是一种重要的编程技术
。该方法用于让一个函数从其内部调用其自身。一个示例就是计算阶乘。0 的阶乘被特别地定义为 1。 更大数的阶乘是通过计算 1 * 2 * ...来求得的,每次增加 1,直至达到要计算其阶乘的那个数。下面的段落是用文字定义的计算阶乘的一个函数。“如果这个数小于零,则拒绝...
什么叫做嵌套调用?
什么叫做递归调用
答:
所谓嵌套调用就是在一个函数中调用其他函数的过程叫做函数的嵌套。C++中函数的定义是平行的,除了main()以外,都可以互相调用。函数不可以嵌套定义,但可以嵌套调用。比如函数1调用了函数2,函数2调用了函数3,这便形成了函数的嵌套调用。
递归调用
:在调用一个函数的过程中又直接或间接第调用该函数本身的...
递归
是怎么回事?有没有专门介绍这方面的书啊?
答:
(1)数据的定义是按递归定义的。(Fibonacci函数)(2)问题解法按递归算法实现。(回溯)(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)递归的缺点:递归算法解题的运行效率较低。在
递归调用
的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。例子:include...
什么是递归
函数? 怎样实现递归?
答:
递归
就是一个函数在它的函数体内
调用
它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。所以递归要有两个要素,结束条件与递推关系。递归有两个基本要素:(1)边界条件:确定递归到何时终止,也称为...
递归
的通俗解释
答:
递归
就是在运行的过程中调用自己。构成递归需要具备的条件,第一指问题必须原始问题是同样的问题,而且更为简单,第二,不能无限制的
调用,
本身必须要有一个出口,作为结束递归的条件。
大家正在搜
直接递归调用与间接递归调用
什么是递归调用
递归调用的过程是什么
什么是函数的递归调用
递归调用和嵌套调用的区别
递归调用过程详解
函数递归就是调用该函数本身
递归调用的形式和特点
函数的递归调用是指
相关问题
什么是递归调用
js的promise如何递归调用?
java中的递归如何理解,能举个例子最好了,希望说的详细一点...
能详细点说明下递归吗,最好有现实例子说明
C语言递归进栈后何时出栈?请大神详细点回答?
递归,逆归式,迭代知道的这些的,讲的详细点
c语言中递归函数的入门,对你们来说很简单的,帮忙分析下,尽量...
Java编程1!+2!+3!+...+n!的和要用递归,请写...