Механизм передачи параметров меня смущает. Я прочитал множество статей об этом, например Is Java "pass-by-reference" or "pass-by-value"?. Я знаю, что они передают его по стоимости. Однако они не говорили об одном случае: проходя мимо самого объекта.передать строку параметру методу самим объектом вместо имени переменной (java)
Я столкнулся с этой проблемой при решении вопроса о ликетке.
Генерировать Скобки
Учитывая п пар скобок, написать функцию, чтобы генерировать все комбинации хорошо сформированных круглых скобках.
Например, при п = 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);
}
Второй параметр вспомогательного метода передается строкой вместо имени переменной строки, что произойдет в этом случае? Я думаю, может быть, это та часть, которая мешает мне понять код. Может ли кто-нибудь сказать мне, почему этот код работает? Я действительно трачу много времени на чтение механизма передачи параметров и рекурсии на Java, но это все еще меня смущает.
Большое спасибо.
Пожалуйста, уточните вопрос? – SarthAk
Результат оценки выражения 'str +" ("' является ссылкой на объект String, который является конкатенацией строки, на которую ссылается 'str'and строки String'" ("'. Итак, вы все еще проходите ссылка на объект типа String по значению. Используете ли вы переменную или выражение, ничего не меняете. –
Это не то, и вы передаете копию ссылки на объект. Таким образом, есть строка String в памяти. Новое обращение к нему генерируется «на лету», когда вы вызываете метод. –