对递归执行过程的简单描述
2017-11-03 09:45
197 查看
原文链接:点击打开链接
#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. 递归函数中必须包含可以终止递归调用的语句来避免死循环。
输出结果为:
分析
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>
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. 递归函数中必须包含可以终止递归调用的语句来避免死循环。
输出结果为:
分析
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. 递归函数中必须包含可以终止递归调用的语句来避免死循环。
相关文章推荐
- 对递归执行过程的简单描述
- STM32 学习过程中 printf 函数 突然不能执行的简单提示问题
- 形象描述:从高级语言到最最底层(比如最基本的门电路)的执行过程
- 下面画一个简单托管代码和非托管代码的执行过程:
- 简单标签执行过程
- Hadoop: MapReduce2多个job串行处理 复杂的MapReduce处理中,往往需要将复杂的处理过程,分解成多个简单的Job来执行,第1个Job的输出做为第2个Job的输入,相互之间有一
- 简单C语言程序的执行过程
- 从一个简单的例子看ajax的执行过程
- 简单的语言描述Dashimoto算法的过程
- 使用递归调用求数组的最大值,了解递归的栈调用以及递归函数的具体执行过程
- mysql简单存储过程创建并返回执行结果
- android开机过程简单描述
- SQL2000 存储过程中实现递归的一个简单例子
- 从一个简单的例子看ajax的执行过程
- PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
- 递归简单描述
- 归并排序-有递归描述过程
- tomcat执行过程的简单理解
- 对于HTML页面中CSS, JS, HTML的加载与执行过程的简单分析
- 程序执行过程的内存分析(简单篇)