函数递归入栈、出栈剖析

递归函数定义

递归函数可以通过将复杂的问题分解成相同类型的子问题。这个分解过程在到达一个基本情况时就停止了,也就是说,一个简单的子问题足以被直接解决。


接下来,我们以一个简单例子回顾一下递归函数。

如:现有五位同学前后坐一列,第五个同学说“我比第四个同学大两岁”,第四个同学说““我比第三个同学大两岁”,第三个同学说““我比第二个同学大两岁”,第二个同学说““我比第一个同学大两岁”,第一个同学说““我今年10岁了”。问:第五个同学多大?


解析:

根据题意,前者比后者大两岁,则一步步计算可知,转化成算法,也就是直译,代码如下:

int Age(int n)//第n个人的年龄
{
	if(n == 1)
		return 10;
	else 
		return 2+Age(n-1);
}

当然,第一次写也不太会很懂,但你可以继续往下看,如图为递归函数入栈示意图。

递归函数入栈示意图。当想要知道第五位同学的年龄时,从函数顶部开始运行,发现其需要调用第四个同学年龄,于是,把栈帧Age(5)放到栈中;函数又从顶部开始运行,发现第四位同学的年龄需要调用第三位同学的年龄,于是,把栈帧Age(4)放到栈中;函数又从顶部开始运行......直到第五位同学时,函数从顶部运行,到tmp=10停止。到这里程序只进行了一半,还需要回调函数,可是怎末回调呢?这又是一个问题。不过,别急,下面是递归函数出栈示意图。

上面说到了第一位同学的年龄是10岁。紧接着可以发现,栈中已经存放了五个中间值,分别是五位同学的,当第一位同学的年龄已知后,便把Age(1)从栈内存中释放出去;函数随之调用栈中Age(2),通过计算后释放其在栈中的内存;以此类推,最终可以得到第五位同学的年龄。


结果

第五位同学的年龄为18岁。

谢谢观看,可以的话给个小心心哦。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值