递归函数内部的执行顺序_递归代码执行顺序-程序员宅基地

技术标签: C/C++  递归  C++  

#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;  
}  

输出结果:

分析:

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

程序结束。

总结:
1. 每一级的递归都使用它自己的私有的变量n,可以查看地址的值来证明。
2. 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行。
3. 位于递归调用语句前的语句的执行顺序和各个被调用函数的顺序相同,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反。

4. 递归函数中必须包含可以终止递归调用的语句来避免死循环。

带返回值:

#include <stdio.h>

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

int main()
{
    int result = fun(1);
    printf("main - result: %d\n", result);
    return 0;
}

输出结果:



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caoshangpa/article/details/80362743

智能推荐

骁龙865和麒麟985哪个好_骁龙865 麒麟985-程序员宅基地

文章浏览阅读7.9k次。麒麟985芯片是自身就有5G通讯能力,而骁龙的865只有和X55芯片结合时才会有5G的通讯能力,麒麟985采用领先的7nm5GSoC,拥有旗舰的5G体验,领先的八核CPU,全新的Mail-G77 GPU,领先的双核NPU。我用的手机就是活动时8折抢购的 点击开抢 https://shouji.jd.com从数据上看,在5G速度方面比骁龙865+X55组合形式下行速度快40%,上行速度快75%;在密集场所下载速率比后者快13%;告诉场景下下载速率比后者快31%;高铁场景下下载速度比后者快3倍;能效比是后者的_骁龙865 麒麟985

什么是Lib-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏24次。概念LIB有两种:一种是静态库,比如C-Runtime库,这种LIB中有函数的实现代码,一般用在静态连编上,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了。 一种LIB是和DLL配合使用的,里面没有代码,代码在DLL中,这种LIB是用在静态调用DLL上的,所以起的作用也是链接作用,链接完成了,LIB也没用了。至于动态调用DLL的话,根本...

ZYNQ 的三种GPIO :MIO EMIO AXI_GPIO_zynq 的emio管脚在哪-程序员宅基地

文章浏览阅读309次。学了zynq一段时间,一上来的时候就被zynq的GPIO唬住了,实在没搞清楚zynq的GPIO怎么回事,一会这样,一会那..._zynq 的emio管脚在哪

Redis7 安装 与卸载_centos7卸载redis-程序员宅基地

文章浏览阅读782次。redis 7 安装 和 卸载_centos7卸载redis

VUE使用three.js模型缩放卡顿问题_vue js添加transform scale样式卡顿-程序员宅基地

文章浏览阅读4.5k次,点赞4次,收藏13次。VUE使用three.js模型缩放卡顿问题最近将之前开发的three.js程序集成到vue项目中,发现模型的旋转可缩放变得比较卡顿,网上搜集资料发现是将scene与controls放在vue data中的缘故,解决方法是将其定义在vue之外,然后在method中修改,完整代码如下。<template> <div class="test" id='gltf'> ..._vue js添加transform scale样式卡顿

性能优化方案(整理)-程序员宅基地

文章浏览阅读722次。性能优化方案(整理)     CDN技术详解一本好的入门书是带你进入陌生领域的明灯,《CDN技术详解》绝对是带你进入CDN行业的那盏最亮的明灯。因此,虽然只是纯粹的重点抄录,我也要把《CDN技术详解》的精华放上网。公诸同好。第一章引言“第一公里”是指万维网流量向用户传送的第一个出口,是网站服务器接入互联网..._性能方案样例

随便推点

32基础时钟知识-程序员宅基地

文章浏览阅读126次。stm32时钟的基础知识

热门论文|一种用于SAR图像去噪的双分量深度学习网络_适用于sar图像的去噪网络-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏14次。1.Intruction    在目标识别、对象追踪和图像分类等领域,对高质量合成孔径雷达图像(SAR image)的需求十分迫切。然而,合成孔径雷达图像的质量天生就会受到多重信道噪声的影响,这极大地阻碍了图像的应用。    2017年以来,基于深度学习的方法能很好地学习噪声图像和无噪声图像之间的底层映射,然而,与光学图像训练不同的是,在现实中无法直接获得无噪声的SAR图像。为了产生训练对,一..._适用于sar图像的去噪网络

vc十十ado连接mysql_VC++ 用ADO连接数据库的简单方法-程序员宅基地

文章浏览阅读108次。在头文件中要包含#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF","serEOF") //serEOF是自己随便起个名字,命名空间//插入函数① 与②不同是声明了_variant_t RecordsAffected;在生成字符串的时候用左右。//以SQ..._ado vc++ _connectionptr conn(__uuidof(connection))

node.js操作数据库_nodejs数据库操作-程序员宅基地

文章浏览阅读1.3k次。学习使用SQL语句结构化查询语言(Structured Query Language)简称SQL,用来操作关系型数据库:是一种数据库查询和程序设计语言,用来存取数据以及查询、更新、和管理关系型数据库。sql是数据库脚本文件的扩展名。最常用的用于数据操作的sql语句有四类,分别对应对数据的四种操作:1.增(create)(例如:用户注册)格式:insert into 表名(字段名1,字段名2,....) values (值1,值2,....)注意: 字段的顺序要和值的顺序..._nodejs数据库操作

js点击图片弹出框能够放大图片_js点击图片弹出大图-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏16次。&lt;div id="outerdiv" style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;"&gt;&lt;div id="innerdiv" style="position:absolute;"&gt;&lt;img i_js点击图片弹出大图

YTU-OJ- 输出日期时间--友元类_uyoj-程序员宅基地

文章浏览阅读745次。Problem H: C++ 习题 输出日期时间--友元类Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 979 Solved: 507[Submit][Status][Web Board]Description设计一个日期类和时间类,编写display函数用于显示日期和时间。要求:将Time类声明为Date类的友_uyoj