c++ - 递归创建——nested()

标签 c++ algorithm recursion

我正在尝试解决“经典”动态规划问题之一。问题是 - 给定一个数字作为输入,生成可能的嵌套条件。

编辑:正如下面的 temp 所指出的,我将首先尝试使用递归来解决这个问题,然后尝试使用动态编程。

即。如果 n = 3

O/p
((()))
()()()
(())()
()(())
(()())

我解决问题的方法基于两个规则。

  1. 如果最大数量 ( 这里3)未达到且数量 左大括号的个数小于或等于 到右大括号的数量。
  2. 仅在最大数量时添加右大括号 是 未达到及权利数量 大括号的数量小于左大括号的数量 大括号。

从理论上讲,它们听起来是正确的,但它与下面的源完全不同。请原谅硬编码。

编辑:我做了一些修改,并且离解决方案更近了一步:)

 #include <iostream>
#include <vector>
#include <string>

using namespace std;

void printPar(int l,int r,string s)
{
    if(l > 3 || r > 3 || r >l)
        return;



    if(l==3 && r==3)
    {
        cout<<s<<endl;
        return;
    }
    else
    {

         if((l<3))
         {
            s+="<";
            l = l+1;
            printPar(l,r,s);
         }
          if(r<3 && r < l)
         {
             s+=">";
             r = r+1;
            printPar(l,r,s);
         }
       //  cout<<"Exiting "<<l<<" & "<<r<<" "<<s<<endl;
    }
}




int main()
{
    string s;
    printPar(0,0,s);
    return 0;
}

调试:

<<<>>>
<<<>>>
<<><>>
<<><>>
<><<>>
<><<>>
<><><>
<><><>

我明白为什么列表中有重复的值。即,一旦使用递归调用函数并最终执行下一个分支。第二次打印是由于它本身落在第二个分支上的函数。有什么办法可以处理这个问题吗?我实在不想走全局统一的路线。

另外,在我看来,这段代码应该打印 (())() - 但它没有:(

有人可以指出错误吗?

谢谢!

我知道情况需要一些调整,但我一直在无休止地盯着这个。停下!

最佳答案

目前,您的解决方案没有利用动态编程。如果你想在这里使用DP,你需要递归地思考问题。幸运的是,这个问题有一个很好的递归公式:

  1. 只有一种方法可以从无括号生成平衡括号,即根本没有括号。
  2. 如果要平衡 n + 1 对括号,则可以按如下方式生成所有平衡括号:对于从 0 到 n 的所有 i,构造 (X)Y 形式的每个字符串,其中 X 是由 i 个平衡括号组成的字符串,Y 是由 n - i 个平衡括号组成的字符串。

此设置的优点在于,要计算 n + 1 个平衡括号的所有字符串,您只需要知道如何为 0, 1, 2, ..., n + 1 创建平衡括号。因此,您可以通过迭代构建 n = 0、1、2、...等的解决方案并重用您在前面步骤中生成的结果来解决此问题。

希望这有帮助!

关于c++ - 递归创建——nested(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187927/

相关文章:

algorithm - 任何线性算法的 Big Omega 是 n 还是也可以是 1?

市场排名算法

javascript - 从数组中获取第一个唯一元素

java - 更好地理解 Java 中的递归

c++ - C++ 中的斐波那契数列 : Control reaches end of non-void function

c++ - 构建 Metakit 时 undefined reference

c++ - 使用 COMMON 语句编译 C++(包括 Fortran 库)

c++ - 更高效地编写 if 语句

c++ - 大多数顺序值指向同一对象的查找表?

c# - 在递归方法中使用 async/await 的正确方法是什么?