递归函数test的输出解析及循环条件变更后的结果咨询
递归函数执行流程解析
原代码(循环条件i<2)的输出解释
原代码如下:
void test(int start) { for(int i=start; i<2; i++) { printf("%d", start); test(i+1); } } // 调用入口:test(0);
调用test(0)的输出为010,最后一个0的来源可通过逐步拆解执行流程明确:
- 进入
test(0),循环变量i初始化为0,满足i<2:- 打印
0,当前输出:0 - 调用
test(1),进入该函数:i初始化为1,满足i<2:- 打印
1,当前输出:01 - 调用
test(2),进入后i=2不满足i<2,循环直接结束,函数返回
- 打印
test(1)的i自增到2,不满足循环条件,函数返回
- 打印
- 回到
test(0)的循环,i自增到1,满足i<2:- 打印
0,当前输出:010 - 调用
test(2),同样因i=2不满足条件直接返回
- 打印
test(0)的i自增到2,循环结束,函数返回
可见最后一个0是test(0)循环的第二次迭代(i=1时)打印的结果。
修改循环条件为i<3后的输出结果
修改后的代码:
void test(int start) { for(int i=start; i<3; i++) { printf("%d", start); test(i+1); } } // 调用入口:test(0);
逐步执行后的最终输出为0121020,执行流程拆解:
test(0),i=0:- 打印
0→ 输出:0 - 调用
test(1):test(1),i=1:- 打印
1→ 输出:01 - 调用
test(2):test(2),i=2:- 打印
2→ 输出:012 - 调用
test(3),循环不满足直接返回
- 打印
test(2)的i自增到3,循环结束返回
test(1)的i自增到2:- 打印
1→ 输出:0121 - 调用
test(3),直接返回
- 打印
test(1)的i自增到3,循环结束返回
- 打印
test(0)的i自增到1:- 打印
0→ 输出:01210 - 调用
test(2):test(2),i=2:- 打印
2→ 输出:012102 - 调用
test(3),直接返回
- 打印
test(2)的i自增到3,循环结束返回
- 打印
test(0)的i自增到2:- 打印
0→ 输出:0121020 - 调用
test(3),直接返回
- 打印
test(0)的i自增到3,循环结束返回
- 打印
内容的提问来源于stack exchange,提问作者Pengcheng
相关产品推荐
相关产品推荐

