2016-02-15 2 views
-1

Механизм передачи параметров меня смущает. Я прочитал множество статей об этом, например 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, но это все еще меня смущает.

Большое спасибо.

+0

Пожалуйста, уточните вопрос? – SarthAk

+0

Результат оценки выражения 'str +" ("' является ссылкой на объект String, который является конкатенацией строки, на которую ссылается 'str'and строки String'" ("'. Итак, вы все еще проходите ссылка на объект типа String по значению. Используете ли вы переменную или выражение, ничего не меняете. –

+0

Это не то, и вы передаете копию ссылки на объект. Таким образом, есть строка String в памяти. Новое обращение к нему генерируется «на лету», когда вы вызываете метод. –

ответ

0

Примитивы в Java передаются по значению, но объекты передают копию ссылки. Также показаны последние четыре строки этого кода, 3/4 - фигурные скобки. Что именно вы пытаетесь понять?

Таким образом, этот код в основном предоставляет список строк в результате, используя метод рекурсии. Я не знаю, как много вы знаете о рекурсии, но в основном он вызывает метод в том же методе. Сначала это может сбивать с толку, но если вы это понимаете, вы можете написать красивый и короткий код. В основном это добавляет String в результат List. слева и справа - количество скобок влево и вправо в текущей строке. Я прокомментировал код, возможно, поможет вам понять немного лучше.

public class Solution { 
public List<String> generateParenthesis(int n) { 
    List<String> result = new ArrayList<String>(); //The list that gets returned at the end of generateParenthesis method. 
    String str = new String(""); //Initialized string that contains nothing. 
    helper(result, str, 0, 0, n); //First call of helper method. 
    return result; //Final result gets returned to caller. 
} 

public void helper(List<String> result, String str, int left, int right, int n){ 
    //If number of left parenthesis and number of right parenthesis is the number of parenthesis total we need, which in your example is 3 of each, add the string to the List result and return to the last caller. 
    if(left == n && right == n){ 
     result.add(str); 
     return; 
    } 

//If the number of left parenthesis is less than the number of right parenthesis, return to the last call of method. 
     if(left < right){ 
      return; 
     } 
    //If the number of left parenthesis is less than the number of total required, add a left parenthesis to String str and incremement number of left parenthesis by one. 
     if(left < n){ 
      helper(result, str + "(", left + 1, right, n); //call helper via recursion and make the new value of str = str+"(" and increment number of left parenthesis by 1. 
     } 



    //If number of right parenthesis is less than the number of total parenthesis required, add a right facing parenthesis to String str and increment number of right parenthesis by one. 
     if(right < n){ 
      helper(result, str + ")", left, right + 1, n); 
     } 
    } 
Смежные вопросы