关于递归函数内存的堆栈

renzaijiang 2006-12-05 02:46:18
经常看到递归函数,老师说递归是反复堆栈实现的,我在菲波那数列加几行代码
跟踪,不知道堆栈中返回临时的值保存到那去了,下次从那里取,那位描述一下这个过程呢
int fac(int n)
{
cout<<"调用fac("<<n<<")"<<endl;
if(n==0||n==1)
{
cout<<"返回"<<n<<endl;
return n;
}
else
{
int temp=fac(n-1)+fac(n-2);
cout<<"返回"<<temp<<endl;
return temp;
}

}
void main()
{
fac(4);
}
运行结果:
调用fac(4)
调用fac(3)
调用fac(2)
调用fac(1)
返回1
调用fac(0)
返回0
返回1
调用fac(1)
返回1
返回2
调用fac(2)
调用fac(1)
返回1
调用fac(0)
返回0
返回1
返回3



Press any key to continue
...全文
286 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CyberKnightGIC 2006-12-06
  • 打赏
  • 举报
回复
你所说的fac(n)=f(n-1) + f(n-2),它运行先f(n-1),递归调用,完毕了再运行f(n-2),这中间函数的返回值都被保存压在堆栈里了啊
renzaijiang 2006-12-05
  • 打赏
  • 举报
回复
楼上的说的模糊啊
我想说的是当比如

调用fac(1)
返回1
调用fac(0)
返回0
而fac(2)=f(1)+f(0)
f(1) f(0)值都弹出了 上那找去 是不是保存到某个地方去了
healer_kx 2006-12-05
  • 打赏
  • 举报
回复
你要是有个VC6啥的,看看内存啊,看看栈啊,就都明白了。
CyberKnightGIC 2006-12-05
  • 打赏
  • 举报
回复
所谓栈,是一种先进后出的结构,系统栈也是这样,只是系统栈是不需要你手动控制入栈和出栈的。抛开递归不谈,先说函数调用,当某个函数执行到了某行要调用另一个函数,首先系统会将被调用的函数地址和参数压到系统栈中,然后运行被调用的函数,遇到其中的临时变量(自动变量)也将其压在栈里面,如果在这个函数中又调用其他函数,则将其他函数的地址和参数压进系统栈,再运行其他函数。当被调用的函数运行结束时将临时变量弹出(1。这是系统控制的,2。这是一个栈临时变量在参数后压入的所以先出来),然后是弹出参数,然后又回到调用函数。现在回到这个问题,递归函数也是一样的道理,首先调用该函数,该函数指针和参数进栈,运行中又碰到调用该函数,该函数的地址和当前的参数又压进栈(在前面那个函数指针参数等的上面)...依次类推,最后一直到n==0||n==1,好,现在最后一次压入的函数出栈了,然后是倒数第二个,...一直到最上面一层,最后运行完毕。系统栈的空间是有限的,这点切记,你可以把n搞的很大,看看发生什么情况:StackOverflow。

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧