递归星号图案程序中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
相关产品推荐
相关产品推荐

