【问题标题】:Why is my output for Balanced Bracket Problem using Recursion wrong为什么我使用递归的平衡括号问题的输出错误
【发布时间】:2021-04-28 17:35:45
【问题描述】:

所以我写了一些递归代码,用于在输入括号对(noOfPairs)的数量时打印平衡括号。但是我的答案是错误的。

例如:输入 n = 2 时,两种类型的括号将是 (()) 或 ()() 但我的程序输出的是 (()) 和 (()( 这是错误的。请帮助!

// Generate Brackets Strings Problem
// Using Recursion
// Given a number N, generate BALANCED BRACKETS using n pairs of Round Brackets

#include<iostream>
#include<cstring>

using namespace std;

// recursive function
void generateBrackets(string output, int noOfPairs, int open, int close) {   // open = open brac ; close = close brac
    // base case
    if (output.length() == 2 * noOfPairs) {
        cout << output << endl;
        return;
    }
    // adding brackets (recursive)
    // 2 ways in the middle of the string
    if (open < noOfPairs) {
        output.push_back('(');
        generateBrackets(output, noOfPairs, open + 1, close);
    }
    if (close < open) {
        output.push_back(')');
        generateBrackets(output, noOfPairs, open, close + 1);
    }
    return;
}

int main() {
    // input
    int n;
    cout << "Enter the number of pairs of round brackets" << endl;
    cin >> n;

    // make an output string
    string output;

    generateBrackets(output, n, 0, 0);

    return 0;
}

【问题讨论】:

  • 这真的是出生发送到debugger进行单步执行,特别是因为您有一个可重复的简单案例。
  • 我这样做了,问题在于返回语句的工作次数!在打印了 -- (()) 之后,return 语句应该执行 3 次以删除最后 3 个括号,从而将输出字符串保留为 -- ( 但 return 语句仅执行 2 次。
  • @DivijJain "return 语句应该执行 3 次以删除最后 3 个括号" -- return 语句不会删除任何内容。尝试单步执行您的代码,而不是只计算return 语句。注意返回后立即发生的事情。
  • 你需要弹出你推的支架。

标签: c++ string algorithm recursion backtracking


【解决方案1】:
#include<iostream>
using namespace std;
void parenthesis(int open, int close, string brak)
{
   if (open == 0 && close == 0)
      cout<<brak;
   if (open>close)
      return;
   if (open > 0)
      parenthesis(open-1, close,brak + "(");
   if (close > 0)
      parenthesis(open, close - 1,brak + ")");
}
void printPar(int n)
{
   parenthesis(n,n,"\n");
}
int main()
{
   int n=1;
   printPar(n);
   return  0;

}

【讨论】:

  • 稍微解释一下你的答案会很好
【解决方案2】:

在第一次递归调用generateBrackets 之后,您需要弹出刚刚推送的“(”,否则它会干扰您添加右括号的下一次调用。

【讨论】:

  • 是的,我几个小时前就知道了,但我还是不明白为什么?请帮我解决这个问题。我被困了好几个小时!
  • 这是因为您的算法应该工作的方式是,在每一步中,您都尝试了两个选项来添加您可以添加的内容 - 如果您可以添加“(”然后尝试,如果可以添加一个“)”然后也尝试一下。因为您没有在两者之间弹出“(”,所以实际上是在添加“(”和“()”,而不是“(”和“)”。
猜你喜欢
  • 2019-10-22
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2015-10-18
  • 2011-02-12
  • 2023-01-21
相关资源
最近更新 更多