C语言的递归问题 为什么会倒过来执行一次

2024-12-23 11:44:24
推荐回答(3个)
回答1:

其实递归调用就是一个“压栈”/“弹栈”的过程。
每一次递归调用,就会把当前的现场压栈,然后调用下一层;调用完毕后,从栈中恢复现场,继续执行。
拿你这个递归函数来看,在入口和出口处分别打印了一条日志。
入口处的日志,一进入函数即被执行,然后进行递归调用,递归返回后,再打印出口的日志。
这样总体调用效果就像这样:
1 # 第1层递归入口
| 2 # 第2层递归入口
| | 3 # 第3层递归入口
| | | 4 # 第4层递归入口
| | | 4 # 第4层递归出口,返回上层
| | 3 # 第3层递归出口,返回上层
| 2 # 第2层递归出口,返回上层
1 # 第1层递归出口,返回上层

回答2:

void up_and_down(int n)
{
printf("Level %d: n location %p\n",n,&n);//进入子过程前执行输出
if(n<4)
up_and_down(n+1);//这里进入下一个子过程
printf("LEVEL %d: n location %p\n",n,&n);//从子过程返回后执行输出
}

那么一步步剖析,n与指令流:
n 指令流
1 输出,进入子过程
2 输出,进入子过程
3 输出,进入子过程
4 输出,输出
3 从子过程返回,输出
2 从子过程返回,输出
1 从子过程返回,输出
注意每一个递归中有一前一后两个printf哦

回答3:

仿真一下就知道原因了