Java递归排列问题基准条件疑惑:为何str未显式更新却长度为0
递归逻辑与基准条件解析
核心问题拆解
你困惑的两个关键点:
- 为什么基准条件设为
str.length() == 0 - 明明没修改原
str,怎么会出现长度为0的情况
关键前提:Java字符串的不可变性
Java里的String是不可变对象,一旦创建就无法修改。代码里的原str(比如main方法里的"abc")自始至终都没被改动过,每次递归传递的是全新生成的字符串。
为什么str长度会变成0
看循环里的核心代码:
String newStr = str.substring(0, i) + str.substring(i + 1);
这行代码的作用是:从当前str中移除第i个字符,生成一个长度减1的新字符串。比如当前str是"abc",i=0时,substring(0,0)是空字符串,substring(1)是"bc",拼接后newStr就是"bc"——长度比原str少1。
每次递归调用perm(newStr, permutaions + currChar)时,传入的newStr都是去掉了一个字符的新字符串。每往下递归一层,字符串长度就减1,直到某一层递归时,newStr是空字符串(所有字符都被移除),此时传入的str长度就是0。
基准条件str.length() == 0的意义
当str长度为0时,说明原字符串的所有字符都已经被选入permutations字符串,此时permutations就是一个完整的排列结果,直接输出它并返回,结束当前递归分支。
具体执行流程片段示例
以初始调用perm("abc", "")为例:
- 第一次循环i=0,生成
newStr="bc",调用perm("bc", "a") - 在
perm("bc", "a")中,循环i=0,生成newStr="c",调用perm("c", "ab") - 在
perm("c", "ab")中,循环i=0,生成newStr="",调用perm("", "abc") - 此时
str.length() == 0,触发基准条件,输出"abc",返回上一层递归
后续循环分支会生成"acb"、"bac"等所有排列,逻辑一致:每一层递归把当前字符串的一个字符移到permutations里,剩余字符组成新字符串继续递归,直到无剩余字符,输出完整排列。
内容的提问来源于stack exchange,提问作者Mukund Karki
相关产品推荐
相关产品推荐

