java - 在 JAVA 中使用 recursion 获得不同的结果 StringBuilder 与 String
问题描述
当我以 StringBuilder 作为参数运行下面的代码时,我得到不同的输出:
public static List<String> generateParenthesis(int n) {
if(n==0)
return new ArrayList<String>();
List<String> list = new ArrayList<>();
generate(list, new StringBuilder(), 0, 0, n);
return list;
}
public static void generate(List<String> list, StringBuilder s, int j, int k, int n)
{
if(s.length()>2*n || j>n || k>n || k>j)
return;
if(s.length()==2*n && j==n && k==n)
{
list.add(s.toString());
return;
}
if(j<n)
{
generate(list, s.append("("), j+1, k, n);
}
if(k<j)
{
generate(list, s.append(")"), j, k+1, n);
}
}
输出: [((()))]
当我使用参数作为字符串运行相同的代码时,我得到不同的输出:
if(n==0)
return new ArrayList<String>();
List<String> list = new ArrayList<>();
generate(list, "", 0, 0, n);
return list;
}
public static void generate(List<String> list, String s, int j, int k, int n)
{
if(s.length()>2*n || j>n || k>n || k>j)
return;
if(s.length()==2*n && j==n && k==n)
{
list.add(s.toString());
return;
}
if(j<n)
{
generate(list, s+"(", j+1, k, n);
}
if(k<j)
{
generate(list, s+")", j, k+1, n);
}
}
输出: [((())), (()()), (())(), ()(()), ()()()]
谁能帮我理解为什么会这样?谢谢!!
解决方案
不同之处在于它String
是不可变的:每当您连接或以其他方式操作一个String
对象时,您实际上是在创建一个String
具有新值的新对象。
StringBuilder
然而是可变的:您可以更改任何给定StringBuilder
实例的值(这基本上是它存在的主要原因)。
所以在这一行:
generate(list, s.append("("), j+1, k, n);
你
- 修改
StringBuilder
实例 - 称呼
generate
StringBuilder
通话后仍有修改
但在
generate(list, s+"(", j+1, k, n);
你改为
- 创造新
String
价值 - 调用
generate
,传递新值 - 调用后仍然
s
引用以前的值generate
。
推荐阅读
- symmetricds - 使用变换列和变换表 SymmetricDS 的意外行为
- visual-studio - Blazor 应用程序要求我进行的每项更改都重新启动服务器
- android - 不同的 LatLng 进口
- python - keras 图像分类器模型配置
- c# - 使用 PKCE 登录 Discord OAuth 的过程
- android - 在firebase中实现电话和电子邮件身份验证的最佳方法是一次性使用?
- node.js - 在 node.js 中,我无法将变量传递给类的成员函数
- java - 有没有办法找到数组的特定排列?
- assembly - 汇编 - 如何使用压入堆栈的变量
- c# - 如何修复错误 - 操作数类型冲突:日期与 int 不兼容