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

#include<stdio.h>
#include<conio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
getchar();
return 0;
}

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);

}
输出 是8行的 我有个疑问 应该输出1 2 3 4就结束的 为什么还要从4 3 2 1再输出一遍? 根据语句读的不应该啊 另外 其他的递归也没发现有这种情况啊 比如求阶乘的尾递归。。 求大神解惑

其实递归调用就是一个“压栈”/“弹栈”的过程。
每一次递归调用,就会把当前的现场压栈,然后调用下一层;调用完毕后,从栈中恢复现场,继续执行。
拿你这个递归函数来看,在入口和出口处分别打印了一条日志。
入口处的日志,一进入函数即被执行,然后进行递归调用,递归返回后,再打印出口的日志。
这样总体调用效果就像这样:
1 # 第1层递归入口
| 2 # 第2层递归入口
| | 3 # 第3层递归入口
| | | 4 # 第4层递归入口
| | | 4 # 第4层递归出口,返回上层
| | 3 # 第3层递归出口,返回上层
| 2 # 第2层递归出口,返回上层
1 # 第1层递归出口,返回上层
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-04
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哦
第2个回答  2012-12-04
仿真一下就知道原因了
相似回答