递归调用的原理

递归:缩小问题规模,会出现边界条件,通过返回段回去。
递归也就是自己调用自己。
例子:
Age(5):第5个人的年龄 Age(4):第4个人的年龄 Age(3):第3个人的年龄
Age(2):第2个人的年龄 Age(1):第1个人的年龄 Age(n):第n个人的年龄 Ag
Age(n-1):第n-1个人的年龄 给出第1个人的年龄为10

代码如下:

#include<stdio.h>
int Age(int n)
{
	int tmp;
	if(n==1)
	   tmp=10;
	else
		tmp=Age(n-1)+2;
	return tmp;
}
int main()
{
	for(int i=1;i<6;i++)
	{
		printf("第%d个人的年龄为%d\n",i,Age(i));
	}
	return 0;
}

下图为代码得出的结果(如下图)
递归调用的原理
首先代码中入栈的方式如下图,先为n=5先入栈,然后4再入,然后3 2 1 依次入栈。(如下图)
递归调用的原理

那按照入栈方式来说我们可能会想它明明是n=5先入的栈,它又怎么显示结果的时候显示的是第一个人到第5个人的年龄呢?它是怎么实现转成按第一个人到第5个人的顺序输出结果的呢?

往下看,它找第五个人的年龄,没有找到,就依次找第四个人的年龄(如下图)
递归调用的原理
往下继续,找第四个人的年龄还是没有找到,然后再继续找第三个人的年龄(如下图)
递归调用的原理
找第三个人的年龄,还是没有找到,就继续找第2个人的年龄(如下图)
递归调用的原理
找第2个人的年龄,还是没有找到,继续往下找第一个人的年龄(如下图)
递归调用的原理
找到第一个人的年龄的时候终于找到了,原来第一个人的年龄为10,然后找到第一个人的年龄后就开始进行下一步了。(如下图)
递归调用的原理
找到第一个人的年龄之后就往回返,先告诉第2个人我的年龄是10,然后你该计算一下你的年龄。然后第一个人就出栈了。(如下图)
递归调用的原理递归调用的原理
接着第二个人知道第一个人的年龄之后就开始计算自己的年龄,原来自己的年龄比第一个人的年龄大两岁,然后第二个人就知道自己的年龄为12,然后第2个人就出栈了。(如下图)
递归调用的原理

接着第三个人知道第二个人的年龄之后就开始计算自己的年龄,原来自己的年龄比第一个人的年龄大两岁,然后第二个人就知道自己的年龄为14,然后第3个人就出栈了。(如下图)
递归调用的原理
依次往下图片为:
递归调用的原理

递归调用的原理
最后的结果就是第五个人计算出自己的年龄为18,然后返回到主函数去。输出的时候按照出栈顺序依次输出。