递归方法mystery7执行逻辑疑问:输入"abcdefgjijkl"时的困惑
拆解mystery7递归执行过程(以输入"abcdefgjijkl"为例)
先把原代码贴出来方便对照:
public void mystery7(String sWord){ int nL=sWord.length(); if (nL>=3) { mystery7(sWord.substring(0,nL/3)); // 你困惑的第一行递归 System.out.println(sWord.substring(0,nL/3)); mystery7(sWord.substring(0,nL/3)); } }
首先明确输入字符串"abcdefgjijkl"的长度是12个字符,所以第一次调用的nL=12,满足nL>=3,进入if块。
核心逻辑:递归的"栈式执行"
递归的本质是先把当前函数的状态(比如当前的sWord、nL)存到调用栈里,优先执行新的子调用,等子调用完全执行完,再回到当前函数继续处理剩下的代码。这也是你困惑的第一行代码的关键:它会先"钻"到最底层的子调用,直到触发终止条件(nL<3),才会回头执行后续的打印和另一个递归。
一步步走执行流程
用缩进表示调用的嵌套层级,每一层缩进代表一次新的函数调用:
- 第一层调用:mystery7("abcdefgjijkl")
- nL=12,进入if块
- 执行第一行:调用
mystery7("abcdefgjijkl".substring(0, 12/3))→ 也就是mystery7("abcd")(取前4个字符)
2. 第二层调用:mystery7("abcd")- nL=4,进入if块
- 执行第一行:调用
mystery7("abcd".substring(0,4/3))→ 整数除法4/3得1,所以是mystery7("a")
3. 第三层调用:mystery7("a")- nL=1 <3,不进入if块,直接返回(无任何输出)
- 回到第二层调用,第一行递归执行完毕,现在执行
System.out.println("abcd".substring(0,1))→ 打印a - 执行第三行:调用
mystery7("a"),同样nL=1,直接返回 - 第二层调用执行完毕,回到第一层调用
- 第一层调用的第一行递归执行完毕,现在执行
System.out.println("abcdefgjijkl".substring(0,4))→ 打印abcd - 执行第三行:调用
mystery7("abcd"),这个过程和上面的第二层调用完全一致,会再次打印a
最终输出结果
整个执行过程结束后,控制台会依次输出:
a abcd a
再强调你困惑的第一行逻辑
第一行的递归调用是优先执行到底的:比如第一层的第一行调用会先触发第二层,第二层的第一行触发第三层,直到第三层不满足条件返回,才会回到第二层执行打印,再回到第一层执行打印。它就像你走进一套嵌套的房间,必须先走到最里面的小房间,再原路返回,每回到一个房间就做一次打印,然后再去走另一间结构完全相同的嵌套房间(第三行的递归)。
内容的提问来源于stack exchange,提问作者deadalias
相关产品推荐
相关产品推荐

