【发布时间】:2016-02-15 18:47:10
【问题描述】:
参数传递机制让我很困惑。我已经阅读了大量关于此的文章,例如 Is Java "pass-by-reference" or "pass-by-value"?。我知道他们通过价值传递。但是,他们并没有谈论一种情况:经过对象本身。
我在解决 leetcode 问题时遇到了这个问题。
生成括号
给定 n 对括号,编写一个函数来生成格式正确的括号的所有组合。
例如,给定 n = 3,解集是:
“((()))”、“(()())”、“(())()”、“()(())”、“()()()”
还有一个递归代码
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<String>();
String str = new String("");
helper(result, str, 0, 0, n);
return result;
}
public void helper(List<String> result, String str, int left, int right, int n){
if(left == n && right == n){
result.add(str);
return;
}
if(left < right){
return;
}
if(left < n){
helper(result, str + "(", left + 1, right, n);
}
if(right < n){
helper(result, str + ")", left, right + 1, n);
}
}
}
我很难理解代码的作用,尤其是:
if(left < n){
helper(result, str + "(", left + 1, right, n);
}
if(right < n){
helper(result, str + ")", left, right + 1, n);
}
helper方法的第二个参数是通过字符串而不是字符串的变量名传递的,这种情况会发生什么?我想这可能是阻碍我理解代码的部分。谁能告诉我为什么这段代码有效?我确实花了很多时间阅读 Java 中的参数传递机制和递归,但这仍然让我感到困惑。
非常感谢。
【问题讨论】:
-
请详细说明问题?
-
表达式
str + "("的求值结果是对String 对象的引用,该对象是str引用的String 和String"("的串联。因此,您仍然按值传递对 String 类型对象的引用。无论您使用的是变量还是表达式都不会改变任何内容。 -
既不是,也不是。您将引用的副本传递给对象。所以内存中有一些字符串。当您调用方法时,会动态生成对它的新引用。
标签: java recursion parameter-passing