【递归】执行过程探究(c)
2024-09-08 11:18:02
c语言 递归的执行过程探究
引用《c primer plus》第五版 9.3.1 递归的使用
/* recur.c -- recursion illustration */
#include <stdio.h>
void up_and_down(int); int main(void)
{
up_and_down();
return ;
} void up_and_down(int n)
{
printf("Level %d: n location %p\n", n, &n); /* 1 */
if (n < )
up_and_down(n+); /* 递归处 */
printf("LEVEL %d: n location %p\n", n, &n); /* 2 */ }
过程: main()调用了up_and_down(1),
然后第一层的up_and_down(此时n为1),
执行到了我注释的那个地方/*递归处*/即第15行
在递归处调用了up_and_down(调用时将n+1(也就是1+1)赋给了第二层的参量n) 由于调用后第一层要等待第二层的返回,所以第一层执行还没有完成,所以还轮不到第一层的/* 2 */ 处的打印,
第二层的up_and_down又执行到了/*递归处*/,又调用了函数,以此类推。
最后执行到了最深层时,n不再满足小于4的条件,所以不再递归。
就执行了/* 2 */ 处的打印,然后函数结束了,就return返回值【此处return void;】并退出当前层的函数
次深层检测到 被自己调用的函数的返回值 后继续执行/* 2 */ 处的打印,结束后再return void; 依次类推。
输出结果为:
LEVEL 1: n location 0x0012ff48LEVEL 2: n location 0x0012ff3cLEVEL 3: n location 0x0012ff30LEVEL 4: n location 0x0012ff24LEVEL 4: n location 0x0012ff24LEVEL 3: n location 0x0012ff30LEVEL 2: n location 0x0012ff3cLEVEL 1: n location 0x0012ff48
总结:由于c语言的顺序结构,所以调用函数后要等待被调用的函数执行完成(即有返回值后)才能执行下一步,而递归恰恰是一层一层地调用自己,所以得等到最深层执行完成后,才返回值告诉次深层函数可以继续执行。次深层执行后才能返回告诉次次深层继续执行。
【在函数没有执行完成前,不return。 导致了每一个函数都得等待被调用函数的返回才能继续,不断调用就得不断等待被调用的函数,因此必须等最深层函数开始返回后才有了一步步的函数的后续执行和返回】
重点:调用时的LEVEL1地址和返回时的LEVEL1(LEVEL数字)是相同的
每一级递归都使用自己的私有变量(子函数中变量的作用域和储存时期部分的知识) 关于利用递归函数赋值的部分,引用《c primer plus》第五版 9.3.3尾递归
// factor.c -- uses loops and recursion to calculate factorials
#include <stdio.h>
long fact(int n);
long rfact(int n);
int main(void)
{
int num; printf("This program calculates factorials.\n");
printf("Enter a value in the range 0-12 (q to quit):\n");
while (scanf("%d", &num) == )
{
if (num < )
printf("No negative numbers, please.\n");
else if (num > )
printf("Keep input under 13.\n");
else
{
printf("loop: %d factorial = %ld\n",
num, fact(num));
printf("recursion: %d factorial = %ld\n",
num, rfact(num));
}
printf("Enter a value in the range 0-12 (q to quit):\n");
}
printf("Bye.\n"); return ;
} long fact(int n) // loop-based function
{
long ans; for (ans = ; n > ; n--)
ans *= n; return ans;
} long rfact(int n) // recursive version
{
long ans; if (n > )
ans= n * rfact(n-);
else
ans = ; return ans;
}
首先,此处的赋值是 将 函数返回值 赋给一个变量
所以递归赋值这种也是一样的:
一步步等待,直到最深层函数执行完成并返回后,
次深层才能利用返回值执行赋值操作,然后再执行完成并返回
次次深层才能利用返回值执行赋值操作......
依次类推 疑问递归函数里 x=3+addall(n);
那么x的值在递归过程中如何变化? =========End
最新文章
- eclipse下的emacs风格快捷键
- MapReduce 简介
- google浏览器打开报出文件不可读解决方案
- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] --11061188刘强
- SAE网站搭建(2)
- 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms” .
- href 和 src 区别
- HTML5之dir属性
- maven私服 nexus2.x工作目录解读(翻译文档)
- 线上平滑升级nginx1.12
- mysql数据库字符集编码查看以及设置
- 设计模式——工厂方法模式(C++实现)
- UICollectionView 基础
- Android 如何判断指定服务是否在运行中 “Service”
- [SPOJ22343] Norma
- HDU 6124 17多校7 Euler theorem(简单思维题)
- vuex使用modules namespaced 后,模块名不同,函数名相同时候在组件中分发Action
- Linux设备驱动之USB
- Python性能(转)
- 编程开发之--Oracle数据库--存储过程使用动态参数绑定(3)