c++ - 当函数调用中的值增加时程序工作正常,但如果我们在单独的行中增加值而不是调用函数,则会出错。为什么?

标签 c++ recursion output backtracking function-call

**问题是“编写一个函数来生成长度为 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);



}

最佳答案

在第一种情况下,每次递归调用 GenerateParenthesis(n, l + 1, r, ans) l+1r+ 的结果1只传递给被调用者,不会改变调用者变量lr的值。

在第二种情况下,每次递归调用 GenerateParenthesis(n, l, r, ans) l+1r+1< 的结果 被传递给被调用者并改变调用者的变量 lr 的值。

因此,每次函数从其递归调用返回时,变量 lr 的值在这两种情况下都会不同,并且计算可能会有所不同。

关于c++ - 当函数调用中的值增加时程序工作正常,但如果我们在单独的行中增加值而不是调用函数,则会出错。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56896116/

相关文章:

c++ - 像素完美投影矩阵?

c++ - 抑制编译器警告 C++

c++ - QWidget 更新事件但没有视觉更新

Java递归求幂方法使递归更高效

c++ - 在 .h 文件外编写输出运算符重载的实现

c++ - 构造函数定义的语法

scala - 如何使涉及 future 尾递归的函数?

c - 反转单链表的递归方法?

python - 线程子进程的奇怪输出

c++ - C++指针,输出