递归中的return用法,逐级返回

递归中的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 的地址相同。

  • 20
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值