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

递归星号图案程序中star()函数入参为何自动递增?

递归星号打印的逻辑疑问解答

用户代码

#include <stdio.h>

int star(int n) {
    if (n > 1) {
        star(n - 1);
    }
    printf("* ");
}

int logic(int n) {
    if (n > 1) {
        logic(n - 1); 
    }
    star(n); 
    printf("\n");
}

int main() {
   int n = 3;
   logic(n);
   return 0;
}

运行结果

当n=3时,输出如下:

*
**
***

用户疑问

程序虽能正确运行,但难以追踪其逻辑流程,想请教为何star()函数的输入值会自动递增,代码中并未设置相关递增条件。


逻辑流程拆解

你觉得star()的输入值在“递增”,其实是递归调用的“回溯”阶段造成的错觉,根本不存在什么自动递增的逻辑,咱们一步步拆解logic(3)的完整执行过程:

1. 递归递推阶段(逐层深入)

调用logic(3)时,因为3>1,会优先执行logic(2);
调用logic(2)时,因为2>1,会优先执行logic(1);
调用logic(1)时,1>1不成立,直接执行当前层的代码:调用star(1),然后打印换行。

2. 递归回溯阶段(逐层返回执行剩余代码)

递归的核心是先把调用链递推到最底层,再从底层往回执行每层剩下的代码:

  • 当logic(1)执行完,回到logic(2)的调用点,执行它还没跑的代码:调用star(2),然后打印换行;
  • 当logic(2)执行完,回到logic(3)的调用点,执行它还没跑的代码:调用star(3),然后打印换行。

所以star()的实际调用顺序是:star(1) → star(2) → star(3),看起来像是输入值在递增,但这只是回溯时按调用栈的逆序执行了不同层级的star()而已,完全没有任何主动的“递增”操作。

再细化star()的执行逻辑:

  • star(1):1>1不成立,直接打印1个*;
  • star(2):先调用star(1)打印1个*,回溯后再打印1个*,总共输出2个*;
  • star(3):先调用star(2)打印2个*,回溯后再打印1个*,总共输出3个*。

把这些输出按换行拼接起来,就得到了你看到的每行星号数量递增的图案。


内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:13:22