You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会输出递增数字?

递归的核心逻辑是「先深入调用,再回溯执行剩余代码」,咱们一步步走流程:

  1. 第一次调用 PrintNumPattern(12,3):先执行printf("12 "),接着调用PrintNumPattern(9,3)
  2. 调用PrintNumPattern(9,3):先执行printf("9 "),接着调用PrintNumPattern(6,3)
  3. 调用PrintNumPattern(6,3):先执行printf("6 "),接着调用PrintNumPattern(3,3)
  4. 调用PrintNumPattern(3,3):先执行printf("3 "),接着调用PrintNumPattern(0,3)
  5. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:27:31