一个递归函数递归调用里连续调用两次递归函数递归调用本身是怎么运行的?求具体分析

c语言中递归函数的运行过程?- _星空生活网
你现在浏览的是: & > &
c语言中递归函数的运行过程?
c语言中递归函数的运行过程?
对递归的理解绝对有帮助,&n);然后继续执行,继续对局部变量和函数返回地址入栈保存。你可以画栈的图理解求阶乘的过程,即过程能朝着问题结束的方向发展(递归结束条件)#include&stdio.h&gt.子问题在最小尺度上有直接解;);}当一个问题具有如下特征时;3,可用递归求解:1.大问题能分解成若干个子问题;2.子问题或者是一个定值或者是与大问题具有相同性质的问题; printf(&quot,利用栈的先进先出特性,先往下递推,遇到结束条件后回溯(弹栈求结果,最后返回),对于地址的相关问题,如果你学汇编语言就会懂了。希望对你有用。;}void main(){result=%d&#92。直到遇到递归结束条件,开始弹栈。。;n&,形式参数等值。比如计算上面的fun(3)过程:执行时遇到fun(2),保存当前的n(n=3)以及fun(2)执行完后的返回地址,fun(n));); printf(&quot,直到栈空,最终所得的n就是所要求得值。不知道这样的描述你能不能懂。总之;int fun(int n){ printf(&test,这是将栈顶n域值恢复给n,栈顶地址域作为返回地址出栈,继续这样下去;先帮助你理解递归的基本过程 if(n==0)
return 1; else
return n*fun(n-1);首先,递归是通过栈实现的,若没有遇到结束条件,入栈保存本次调用的返回地址,局部变量.\n& scanf(&%d&;输入一个整数: &/&#47..
对递归的理解绝对有帮助,&n);然后继续执行,继续对局部变量和函数返回地址入栈保存。你可以画栈的图理解求阶乘的过程,即过程能朝着问题结束的方向发展(递归结束条件)#include&stdio.h&gt.子问题在最小尺度上有直接解;);}当一个问题具有如下特征时;3,可用递归求解:1.大问题能分解成若干个子问题;2.子问题或者是一个定值或者是与大问题具有相同性质的问题; printf(&quot,利用栈的先进先出特性,先往下递推,遇到结束条件后回溯(弹栈求结果,最后返回),对于地址的相关问题,如果你学汇编语言就会懂了。希望对你有用。;}void main(){result=%d&#92。直到遇到递归结束条件,开始弹栈。。;n&,形式参数等值。比如计算上面的fun(3)过程:执行时遇到fun(2),保存当前的n(n=3)以及fun(2)执行完后的返回地址,fun(n));); printf(&quot,直到栈空,最终所得的n就是所要求得值。不知道这样的描述你能不能懂。总之;int fun(int n){ printf(&test,这是将栈顶n域值恢复给n,栈顶地址域作为返回地址出栈,继续这样下去;先帮助你理解递归的基本过程 if(n==0)
return 1; else
return n*fun(n-1);首先,递归是通过栈实现的,若没有遇到结束条件,入栈保存本次调用的返回地址,局部变量.\n& scanf(&%d&;输入一个整数: &/&#47..
写出对应的函数调用;
(2)对函数的每个递归调用,进入函数后,具体方法如下:
(1)写出函数当前调用层执行的各语句,并用有向弧表示语句的执行次序。因此,递归有两个基本要素:
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线;
(3)在返回路线上标出本层调用所得的函数值。n=3时汉诺塔算法的运行轨迹如下图所示,有向弧上的数字表示递归调用和返回的执行顺序三。反之,退出第i+1层调用应该返回第i层:
(1)运动开始时,首先为递归调用建立一个工作栈,首次递归调用自身称为第1层调用。 在递归函数中,从调用处画一条有向弧指向被调用函数入口,可以通过以下3个步骤实现:
(1)将塔上的n-1个碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一个碟子移到塔C上;
(3)将n-1个碟子从塔B借助塔A移到塔C上:对汉诺塔问题的求解、递归函数的内部执行过程
一个递归函数的调用过程类似于多个函数的嵌套的调用,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 上述汉诺塔算法执行过程中,工作栈的变化如下图所示,其中栈元素的结构为(返回地址,你先设置我最佳答案后,我百度Hii教你。所谓结构自相似递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
递归通常用来解决结构自相似的问题;从第i层递归调用自身称为第i+1层,系统需设立一个工作栈。具体地说,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈,B值,C值),返回地址对应算法中语句的行号,是指构成原问题的子问题与原问题在结构上相似。为了保证递归函数的正确执行,n值,A值、局部变量和返回地址;
(2)每次执行递归调用之前,从中可较直观地了解到各调用层次及其执行情况,其结构包括值参,只不过调用函数和被调用函数是同一个函数,递归调用的内部执行过程如下。采用图示方法描述递归函数的运行轨迹。递归函数只有具备了这两个要素,才能在有限次计算后得出结果汉诺塔问题;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法,分图的序号对应图中递归调用和返回的序号我可以帮助你
//正在修改中
include&stdio.h&int fun(int n){ printf(&test...\n&);//先帮助你理解递归的基本过程 if(n==0)
return 1; else
return n*fun(n-1);}void main(){ int n; printf(&输入一个整数: &); scanf(&%d&,&n); printf(&result=%d\n&,fun(n));}当一个问题具有如下特征时,可用递归求解:1.大问题能分解成若干个子问题;2.子问题或者是一个定值或者是与大问题具有相同性质的问题;3.子问题在最小尺度上有直接解,即过程能朝着问题结束的方向发展(递归结束条件);首先,递归是通过栈实现的,若没有遇到结束条件,入栈保存本次调用的返回地址,局部变量,形式参数等值。比如计算上面的fun(3)过程:执行时遇到fun(2),保存当前的n(n=3)以及fun(2)执行完后的返回地址;然后继续执行,继续对局部变量和函数返回地址入栈保存。直到遇到递归结束条件,开始弹栈,这是将栈顶n域值恢复给n,栈顶地址域作为返回地址出栈,继续这样下去,直到栈空,最终所得的n就是所要求得值。不知道这样的描述你能不能懂。总之,利用栈的先进先出特性,先往下递推,遇到结束条件后回溯(弹栈求结果,最后返回),对于地址的相关问题,如果你学汇编语言就会懂了。
递归函数详细运行过程 :
我给你简单写了一个经典的递归函数(求阶乘) #include&stdio.h& int fun(in...
关于C语言递归问题,下面函数怎么运行啊 具体说下步骤 :
调用func2(1):输出st[1]:e,在调用func1(4):输出st[4]:o,func1(4...
一个递归函数里连续调用两次递归函数本身是怎么运行的?求具体分析 :
void max(100)//1{ max(99)//2 max(98)//3 max(97)//4...
c++递归函数运行顺序?菜鸟一只,求教。 :
小兄弟 你不要骗我 就你给出的代码 怎么可能输出:3 2 1 1 2 6 4 3 2 1 1 2 6...
这个的运行过程是怎样的 想要一个详细的过程~~ C语言 的递归算法 :
求阶乘的。 对于任意的n 如果是0或者1,那么直接返回。 否则返回n*fac(n-1); 比如 如果...
C语言递归算法是怎么执行的 :
递归就是自己调用自己,例如你写的 net()函数,函数自己调用自己。 它调用自己的时候,不管程序运行...
一些问题可以使用递归函数和非递归函数求解,从运行时间看,通常递归函数比非递归函数运算时间哪个更快 :
语句的执行时间是执行次数和执行一次所需时间的乘积。 算法中所有语句的执行次数之和就是算法的时间耗费(...2015年8月 C/C++大版内专家分月排行榜第三2015年5月 C/C++大版内专家分月排行榜第三2015年3月 C/C++大版内专家分月排行榜第三2015年1月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&递归函数详解——调用栈
递归函数,Recurrent function喵。Recurrent,即反复循环。递归函数的这个名字一定程度上反映了它的本质,即不断地调用它自身(直接的或间接的)。递归函数和集合论,数学归纳法,递推数列,有着极为密切的联系。整个计算机科学其实是枝繁叶茂的数学大树上一颗新生的枝干(当然计算机科学也离不开其他一些学科的发展,例如物理学)。计算机科学的根本是建立在数学的基础上的。要了解递归函数,从相关的数学原理入手是很容易理解的。为简便起见,这里不讨论集合论中的最小数原理和数学归纳原理,直接从大家熟知的递推数列开始讲喵。1)递推数列它就像是反向的递归。最简单的一种的形式是X(0)=a0;X(1)=a1;......X(k)=X(n+1)=f(X(n));即,它有k个初始值,又叫做边界条件,然后有一个通用递推公式。这是大家都熟知的东西。接下来对比一下:2)递归数列看起来像是反过来写的递推数列喵。X(n)=phi(X(n-1));X(k)=......X(1)=a1;X(0)=a0;极为相似的,它有k个边界条件。然后也有一个通用递归公式。不过与递推不同,这个公是不是从X(n)到X(n+1)而是反过来从X(n+1)到X(n)。来一个简单的例子X(n)=X(n-1)+1;X(0)=0;好了,一眼就可以看出来这个递归的通项公式其实就是X(k)=k。初步了解了递归数列的概念,接下来看看什么是递归函数。前面说了,递归函数一般来说就是直接或间接的调用了自身的函数。这个数学上的概念是很好理解的,但是在C++程序中函数调用怎么能够以递归这样一种诡异的形式出现呢?我们来看看函数调用的时候系统做了些什么:******************************前方高能反应喵*****************************调用栈&&CALL STACK什么是栈?栈是最基础的几种数据结构之一。又称后进先出表(LIFO&Last In First Out)。顾名思义,它是一种只能在某一端插入和删除的特殊线性表(所谓线性就是一维)。它按后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。为什么要讲这个东西?因为:
栈在函数调用的时候存储断点,任何函数调用都离不开栈!&而函数调用自身就是一个递归过程,其中递归函数就更是离不开栈。我们知道操作系统在程序执行的时候会调用主函数,这是正是使用了一个栈,而系统的这个栈,叫做:
调用栈&&Call Stack
通常一个程序的运行,一般的是函数的相互调用,等所有的调用都完成后,整个程序的运行也就完成了。在这个过程中,每当有新的函数调用,系统都会把该函数的一些信息,包括函数的参数,以及一些寄存器的值等,保存到调用栈上。等该函数运行完成后,这些信息再从调用栈上弹出(按后进先出原则)。
这是刚才那个递归数列的程序,该程序在执行后将打印n=3的值X3=3。
左边红色的点是我设置的程序断点(Breakpoint),在Debug模式里可以让程序运行到该处后暂停,然后我们可以查看该处的各个变量的值和内存里的各种状况。
开始运行后,第一次暂停。查看调用栈:
第二次暂停:
第三次暂停:
运行结果:
通过查看Call Stack我们可以清楚的看到在这次程序执
分享这篇日志的人也喜欢
算早吗……
新人求守护???
歪?有守护吗
第二天、求关注,求守护??
咳不出来又咽不下去
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场下图里的 运行时堆栈 是什么意思?它和 函数可以递归调用自身有什么关系?如果没有运行时堆栈,那么函数_编程 - QQ志乐园
您的当前位置: &
下图里的 运行时堆栈 是什么意思?它和 函数可以递归调用自身有什么关系?如果没有运行时堆栈,那么函数的递归调用会受到什么影响??
来源: |人气:767 ℃|时间: 12:41:25
为了解决用户可能碰到关于"下图里的 运行时堆栈 是什么意思?它和 函数可以递归调用自身有什么关系?如果没有运行时堆栈,那么函数的递归调用会受到什么影响??"相关的问题,志乐园经过收集整理为用户提供相关的解决办法,请注意,解决办法仅供参考,不代表本网同意其意见,如有任何问题请与本网联系。"下图里的 运行时堆栈 是什么意思?它和 函数可以递归调用自身有什么关系?如果没有运行时堆栈,那么函数的递归调用会受到什么影响??"相关的详细问题如下:
大有关系,不止是递归函数,任何函数的执行都依赖这个堆栈,如果没有运行时堆栈,那么函数里面的变量不能按正确的顺序释放,而且结束后不能顺利返回到调用它的地方(因为返回地址就是存放在这个堆栈中,而且是有序的,一次函数调用,必须要有返回地址入栈和出栈,如果只有入栈没有出栈或者没有入栈就出栈都会出错,导致程序崩溃)。1.堆栈是个数据结构,可以简单的理解为容器,存放一条一条的指令。2.递归函数本质就是指令的压栈出栈。3.程序的堆栈不是由你控制的。堆栈结构:先存后读,后存先读的一种数据结构
||||点击排行

我要回帖

更多关于 c语言函数的递归调用 的文章

 

随机推荐