You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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", "")为例:

  1. 第一次循环i=0,生成newStr="bc",调用perm("bc", "a")
  2. 在perm("bc", "a")中,循环i=0,生成newStr="c",调用perm("c", "ab")
  3. 在perm("c", "ab")中,循环i=0,生成newStr="",调用perm("", "abc")
  4. 此时str.length() == 0,触发基准条件,输出"abc",返回上一层递归

后续循环分支会生成"acb"、"bac"等所有排列,逻辑一致:每一层递归把当前字符串的一个字符移到permutations里,剩余字符组成新字符串继续递归,直到无剩余字符,输出完整排列。

内容的提问来源于stack exchange,提问作者Mukund Karki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 19:32:43