C语言递归函数PrintNumPattern执行逻辑疑问:为何出现先减后增的输出?
理解这段递归代码的执行逻辑
首先先把你的代码贴出来方便分析:
#include <stdio.h> void PrintNumPattern(int x, int y) { if (x > 0) { printf("%d ", x); PrintNumPattern(x - y, y); printf("%d ", x);//idk why this makes it work...why does it add? } else { printf("%d ", x); } } int main(void) { int num1; int num2; scanf("%d", &num1); scanf("%d", &num2); PrintNumPattern(num1, num2); }
当你输入12和3时,咱们拆解递归调用栈的执行过程就能搞懂所有问题:
第一个困惑:为什么第二个printf会输出递增数字?
递归的核心逻辑是「先深入调用,再回溯执行剩余代码」,咱们一步步走流程:
- 第一次调用
PrintNumPattern(12,3):先执行printf("12 "),接着调用PrintNumPattern(9,3) - 调用
PrintNumPattern(9,3):先执行printf("9 "),接着调用PrintNumPattern(6,3) - 调用
PrintNumPattern(6,3):先执行printf("6 "),接着调用PrintNumPattern(3,3) - 调用
PrintNumPattern(3,3):先执行printf("3 "),接着调用PrintNumPattern(0,3) - 调用
PrintNumPattern(0,3):因为x>0不成立,直接执行printf("0 "),这个函数执行完毕,开始回溯!
回溯阶段是从最底层的递归往上层走,每回到一层,就执行递归调用后面的代码(就是你标注的那个printf):
- 回到
PrintNumPattern(3,3):执行printf("3 "),函数结束,回到上一层 - 回到
PrintNumPattern(6,3):执行printf("6 "),函数结束,回到上一层 - 回到
PrintNumPattern(9,3):执行printf("9 "),函数结束,回到上一层 - 回到
PrintNumPattern(12,3):执行printf("12 "),函数结束
前半部分的printf是「递减输出」,回溯时的printf是「递增输出」,拼起来就是你看到的结果啦!
第二个困惑:程序怎么知道最终停止在12?
因为最初的调用就是PrintNumPattern(12,3),所有递归调用的回溯最终都会回到这一层。当这一层的递归调用(也就是PrintNumPattern(9,3))执行完毕后,才会执行它后面的printf("12 "),然后这个函数就彻底执行完了,程序自然就停止输出了。简单说,12是初始调用的x值,回溯的终点就是这里,所以最后输出12就停了。
内容的提问来源于stack exchange,提问作者CProgrammingInC
相关产品推荐
相关产品推荐

