递归中的return用法,逐级返回
不明白以下程序段的输出为何是
#include<stdio.h>
int my_pow(int n,int k)
{
printf("level %d: k loacation %p\n", k, &k);
if(k>0)
my_pow(n,k-1)*k;
printf("level %3d: k loacation %p\n", k, &k);
return 12;
}
int main(void)
{
int ret = my_pow(5,4);
printf("%d\n",ret);
return 0;
}
输出结果
不明白,为何从0-4又打印了一遍。其实是递归的逐级返回。递归原理如下
只要if语句为true时,每个recurs()函数调用,执行语句1,然后调用recurs,不会执行语句2 。当if语句为false时,会执行语句2。当前调用结束后,程序控制权将返回给调用他的recurs(),而该recurs将执行语句2,然后结束,并将控制权返回至前一个调用,继续执行语句2,以此类推,直到退出至第一层调用。
因此,如果recurs()执行了5次递归调用,语句 1将在调用中执行5次,然后语句2以函数调用相反的顺序执行5次。进入5层递归后,程序按照进入的路径返回。即如何进去,如何返回。
不明白的话,参照下面的例子
输出结果如下
输出结果如图所示,后面是打印出变量n 的地址,可以看出是原路返回的。每一个递归调用都创建自己的一套变量,因此在程序达到第5次调用时,创建了5个独立的n变量,存在不同的地址里,在相同的层级,n 的地址相同。