Программа работает нормально, когда значение увеличивается в вызове функции, но выдает ошибку, если мы увеличиваем значение в отдельной строке, а затем вызываем функцию.Зачем? - PullRequest
0 голосов
/ 05 июля 2019

** Вопрос заключается в том, чтобы «написать функцию для генерации всех комбинаций правильно сформированных скобок длиной 2 * n. * Например, при n = 3 набор решений:« ((())) »,"(() ())", "(()) ()", "() (())", "() () ()". *

первый код, в котором я выполняю функциювызовите вот так

GenerateParenthesis (n, l + 1, r, ans)

работают нормально и выводят желаемый результат: ((())) Но во втором кодекогда я делаю вызов функции, как

l = l + 1; GenerateParenthesis (n, l, r, ans)

; дать вывод как:))).? // l используется для открытой скобки (слева), а r используется для закрывающей скобки (справа)

Вот два кода

void GenerateParenthesis (int n, int l, int r, vector & ans) {

if (l == n && r == n) {
    ans.push_back(helper);
    return;
}
if (r > l)return;
if (l > n || r >= n)return;

helper.push_back('(');


GenerateParenthesis(n, l + 1, r, ans);
helper = helper.substr(0, helper.size() - 1); //pop_back();

helper.push_back(')');

GenerateParenthesis(n, l, r + 1, ans);

helper = helper.substr(0, helper.size() - 1);  //pop_back();

}

void GenerateParenthesis (int n, int l, int r, vector & ans) {

    if (l == n && r == n) {
        ans.push_back(helper);
        return;
    }
    if (r > l)return;
    if (l > n || r >= n)return;

    helper.push_back('(');
        l=l+1;
    GenerateParenthesis(n, l , r, ans);
    helper = helper.substr(0, helper.size() - 1);

    helper.push_back(')');
           r=r+1;
    GenerateParenthesis(n, l, r, ans);

    helper = helper.substr(0, helper.size() - 1);



}

1 Ответ

1 голос
/ 05 июля 2019

В первом случае при каждом рекурсивном вызове GenerateParenthesis(n, l + 1, r, ans) результат l+1 и r+1 передается только вызываемому абоненту и не меняет значения переменных l и r вызывающей стороны.

Во втором случае при каждом рекурсивном вызове GenerateParenthesis(n, l, r, ans) результат l+1 и r+1 передается вызываемому лицу, а также изменяется значение переменной l и r вызывающего.

Таким образом, каждый раз, когда функция возвращается из своих рекурсивных вызовов, значение переменной l и r будет различным в обоих случаях, и вычисления могут отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...