Java递归打印星号时printStarNTimes执行逻辑相关疑问
递归打印星号逻辑原理解析
核心逻辑:递归的两个执行阶段
输出的规律本质是递归分为递推向下和回溯向上两个阶段,两处printStarNTimes分别在两个阶段执行:
public static void printStars(int count){ if (count == 0){ return; } // 递推阶段执行:调用下一层递归前运行 printStarNTimes(count); printStars(count-1); // 回溯阶段执行:下一层递归返回后运行 printStarNTimes(count); } private static void printStarNTimes(int n) { for (int i = 0; i < n; i++) { System.out.print("*"); } System.out.println(); }
每个递归方法调用都会在JVM虚拟机栈中创建独立的栈帧,存储当前方法的参数、局部变量等信息,所以每层的count值都是独立的,不会互相影响。
1. 递推阶段(前半部分倒序打印)
调用printStars(5)后,会先执行第一个printStarNTimes,再递归调用参数减1的printStars,直到count为0停止:
- 第一层count=5:打印
*****,调用printStars(4) - 第二层count=4:打印
****,调用printStars(3) - 第三层count=3:打印
***,调用printStars(2) - 第四层count=2:打印
**,调用printStars(1) - 第五层count=1:打印
*,调用printStars(0) - 第六层count=0:直接返回,递推阶段结束
这部分输出对应结果的前5行倒序星号。
2. 回溯阶段(后半部分正序打印)
当printStars(0)返回后,会从最内层的递归调用依次往外返回,执行每一层递归里printStars(count-1)之后的代码,也就是第二个printStarNTimes:
- 回到第五层count=1:执行第二个
printStarNTimes(1),打印*,返回上一层 - 回到第四层count=2:执行第二个
printStarNTimes(2),打印**,返回上一层 - 回到第三层count=3:执行第二个
printStarNTimes(3),打印***,返回上一层 - 回到第二层count=4:执行第二个
printStarNTimes(4),打印****,返回上一层 - 回到第一层count=5:执行第二个
printStarNTimes(5),打印*****,所有调用结束
这部分输出对应结果的后5行正序星号,并非count真的递增,是回溯时按从内到外的顺序执行栈帧,每层的count值自然从1逐步增加到5。
内容的提问来源于stack exchange,提问作者sadik
相关产品推荐
相关产品推荐

