对递归执行过程的简单描述

1. 分析代码

#include <stdio.h>

void fun(int n)
{
    printf("1th - Level: %d  Address: %d\n", n, &n);
    if(n < 3)
        fun(n+1);
    printf("2th - Level: %d  Address: %d\n", n, &n);
}

int main()
{
    fun(1);
    return 0;
}

输出结果为:

 

2. 分析代码执行过程

  1. 主函数调用fun(1);
  2. 此时n的值为1,随即输出第一行,并得到n的地址****736并将其抽象为aaaa;
  3. 判断,1 < 3,执行递归语句, 重新执行fun函数;
  4. 由于传递参数为n+1,所以本层n的值为2,随即输出第二行,并得到n的新地址****704将其抽象为bbbb;
  5. 判断,2 < 3,执行递归语句, 重新执行fun函数;
  6. 同理可得本层n的值为3,得到第三行结果,并将n的新地址****672抽象为cccc;
  7. 判断,3 < 3不成立,不执行递归, 直接执行第二条输出语句,即输出第四行结果,此时显示n的地址为cccc,容易理解;
  8. 本层结束,返回上一层断点处继续执行,即n为2的那一层,当时程序已经执行完递归,所以接下来执行第二条输出语句,即得到第五行输出结果,此时n的地址显示为bbbb;
  9. n为2时的一层执行结束,返回上一层,即n为1,当时程序去已经执行递归,所以接下来执行输出语句,即得到第六行输出结果,此时n的地址显示为aaaa;

程序结束。

 

3. 总结:

  1. 每一级的递归都拥有该函数整套的变量值,此例中变量为n,可以查看变量地址的值来证明。
  2. 如果递归函数的变量过多或递归层数过多,递归过程会占用大量内存来存储中间变量,甚至会导致内存溢出。
  3. 每一次函数调用都会有一次返回,当执行完某一级的递归函数时,它会转移到前一级递归处的下一条语句继续执行,直至完成最高一层递归。
  4. 位于递归调用语句前的语句执行顺序和各个被调用函数的顺序相同,位于递归调用语句后的语句执行顺序和各个被调用函数的顺序相反(出栈操作)。
  5. 递归函数中必须包含可以终止递归调用的语句,否则无法跳出递归过程。
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值