C程序输出00246不符合逻辑预期,求原因解析
递归代码输出
00246的原因分析 你提供的C代码如下:
int print(int nb) { if (nb < 0) { return (0); } printf("%d", nb + print(nb - 1)); nb --; return (nb); } int main(void) { print(4); return (0); }
要理解输出00246的原因,核心是搞清楚递归的执行顺序:递归函数会先不断调用自身直到触发终止条件,再从最底层的递归调用开始回溯执行后续代码。我们一步步拆解执行流程:
- 初始调用
print(4),进入函数后先执行printf("%d", 4 + print(3)),因此优先调用print(3) print(3)执行printf("%d", 3 + print(2)),调用print(2)print(2)执行printf("%d", 2 + print(1)),调用print(1)print(1)执行printf("%d", 1 + print(0)),调用print(0)print(0)执行printf("%d", 0 + print(-1)),调用print(-1)print(-1)触发if (nb < 0)条件,直接返回0
现在开始回溯执行每个printf和后续代码:
- 回到
print(0):计算0 + print(-1) = 0+0=0,输出第一个0;执行nb--(nb变为-1),返回-1 - 回到
print(1):计算1 + print(0) =1 + (-1)=0,输出第二个0;执行nb--(nb变为0),返回0 - 回到
print(2):计算2 + print(1)=2+0=2,输出2;执行nb--(nb变为1),返回1 - 回到
print(3):计算3 + print(2)=3+1=4,输出4;执行nb--(nb变为2),返回2 - 回到
print(4):计算4 + print(3)=4+2=6,输出6;执行nb--(nb变为3),返回3
把所有输出按顺序拼接,就是00246。开头的两个0是递归回溯阶段print(0)和print(1)的printf计算结果,和你直觉逻辑的差异,本质是没理清递归"先深入、后回溯"的执行顺序。
内容的提问来源于stack exchange,提问作者malex
相关产品推荐
相关产品推荐

