递归代码疑问:传入参数5时最后一行输出为何是升序而非降序?
递归执行流程解析:为什么最后输出是升序的No.1到No.5?
先把你的代码贴出来方便分析:
public void rec(int val) { if(val == 0) return; for(int i = 0; i < val ; i++) System.out.print("*"); System.out.println("#"); rec(val - 1); System.out.println("No." + val); }
这个问题的核心是理解递归的两个关键阶段:递推(向下调用)和回溯(向上返回)。咱们一步步走一遍传入val=5时的执行过程,就能明白原因了:
递推阶段(从val=5到val=0)
- 调用
rec(5):先执行循环打印*****#,接着调用rec(4) - 调用
rec(4):打印****#,接着调用rec(3) - 调用
rec(3):打印***#,接着调用rec(2) - 调用
rec(2):打印**#,接着调用rec(1) - 调用
rec(1):打印*#,接着调用rec(0) - 调用
rec(0):触发if(val == 0) return;,直接返回,递推阶段结束。
回溯阶段(从val=1回到val=5)
现在开始从最底层的递归调用往回走,执行每个递归调用中rec(val-1)之后的代码:
- 从
rec(0)返回到rec(1):执行System.out.println("No." + 1);→ 输出No.1 - 从
rec(1)返回到rec(2):执行System.out.println("No." + 2);→ 输出No.2 - 从
rec(2)返回到rec(3):执行System.out.println("No." + 3);→ 输出No.3 - 从
rec(3)返回到rec(4):执行System.out.println("No." + 4);→ 输出No.4 - 从
rec(4)返回到rec(5):执行System.out.println("No." + 5);→ 输出No.5
所以你看到的最后几行是No.1到No.5的升序排列,本质是因为回溯是从最小的val开始往上执行后续代码的。如果想要得到降序的输出,只需要把System.out.println("No." + val);移到rec(val-1);之前——这样就会在递推阶段先打印当前val的序号,再调用下一层递归,最终输出就是降序的No.5到No.1了。
内容的提问来源于stack exchange,提问作者Mahmod Elshambaky
相关产品推荐
相关产品推荐

