C# 生成Schrö;小径

C# 生成Schrö;小径,c#,algorithm,list,recursion,combinations,C#,Algorithm,List,Recursion,Combinations,我想用 没有峰值,即没有上升步骤,紧接着是下降步骤。 一些示例适用于n=3: /编码为U,--编码为R和\编码为D。以下是生成这些路径的代码: public static void addParen(List<String> list, int upstock,int rightstock,int downstock,bool B, char[] str, int count,int total,int n) { if (total

我想用 没有峰值,即没有上升步骤,紧接着是下降步骤。 一些示例适用于n=3:

/编码为U,--编码为R和\编码为D。以下是生成这些路径的代码:

 public static void addParen(List<String> list, int upstock,int rightstock,int     
      downstock,bool B, char[] str, int count,int total,int n)
    {


        if (total == n && downstock == 0)
        { 
            String s = copyvalueof(str);
            list.Add(s);
        }

        if (total > n || (total==n && downstock>0) )
            return;
        else
        {
            if (upstock > 0 && total<n)
            { 
                str[count] = 'U';
                addParen(list, upstock - 1,rightstock, downstock+1,B=true,   str, count + 1,total+1,n);
            }
            if (downstock > 0 && total<n && B==false)
            {
                str[count] = 'D';
                addParen(list, upstock,rightstock, downstock - 1,B=false, str, count + 1,total+1,n);
            }

            if (rightstock > 0 && total < n)
            {
                str[count] = 'R';
                addParen(list, upstock, rightstock-1, downstock, B = false, str, count + 1, total + 2,n);
            }
        }
    }

    public static List<String> generatePaths(int count)
    {

        char[] str = new char[count * 2];
        bool B = false;
        List<String> list = new List<String>();
        addParen(list, count-1, count, 0,B,str, 0, 0,count*2);
        return list;
    }
public static void addParen(列表列表,int upstock,int rightstock,int
下降库存,布尔B,字符[]str,整数计数,整数总计,整数n)
{
如果(总计==n&&downstock==0)
{ 
字符串s=copyvalueof(str);
列表。添加(s);
}
如果(总计>n | |(总计==n&&downstock>0))
返回;
其他的
{
如果(上库存>0&&total 0&&total 0&&total

总数为2n。我从n-1上升n权利和零下降开始。因为没有上升,所以我的bool B是假的(如果有上升,那么下降不能在它之后出现,所以为了防止这一点,我把B=真,这阻止了它。)如果有上升,那么应该有相应的下降,总数应该增加1。如果正确,那么总数应该增加2。我的算法通常是这样工作的,但我无法通过这个实现得到正确的结果。

最初的解决方案不适合OP的需要,因为它太复杂,无法移植到javascript,其目的是展示更好的实践来解决这类问题,而不是实际轻松解决这类问题

但是本着使用不可变类型来解决路径算法的精神,我们仍然可以用一种更简单的方式来解决:我们将使用
string

好的,一如既往,让我们建立我们的基础设施:让我们的生活更轻松的工具:

private const char Up = 'U';
private const char Down = 'D';
private const char Horizontal = 'R';
private static readonly char[] upOrHorizontal = new[] { Up, Horizontal };
private static readonly char[] downOrHorizontal = new[] { Down, Horizontal };
private static readonly char[] all = new[] { Up, Horizontal, Down };
还有一个方便的小助手方法:

private static IList<char> GetAllPossibleDirectionsFrom(string path)
{
    if (path.Length == 0)
        return upOrHorizontal;

    switch (path.Last())
    {
        case Up: return upOrHorizontal;
        case Down: return downOrHorizontal;
        case Horizontal: return all;
        default:
            Debug.Assert(false);
            throw new NotSupportedException();
    }
}
我们准备好了!如果我们将其取出进行试驾:

var paths = GetSchroderPathsWithoutPeaks(2);
Console.WriteLine(string.Join(Environment.NewLine, paths));
我们得到了预期的结果:

URRD
URDR
RURD
RRRR

为什么你的解决方案不起作用?好吧,只是你不能弄明白这一事实说明了你目前的解决方案看起来有多么复杂。当这种情况发生时,通常最好退后一步,重新思考你的方法,一步一步地写下你的程序应该做什么,然后重新开始。

原来的解决方案不适合OP的需要,因为它太复杂,无法移植到javascript,其目的是展示更好的解决此类问题的实践,而不是实际轻松地解决这一问题

但是本着使用不可变类型来解决路径算法的精神,我们仍然可以用一种更简单的方式来解决:我们将使用
string

好的,一如既往,让我们建立我们的基础设施:让我们的生活更轻松的工具:

private const char Up = 'U';
private const char Down = 'D';
private const char Horizontal = 'R';
private static readonly char[] upOrHorizontal = new[] { Up, Horizontal };
private static readonly char[] downOrHorizontal = new[] { Down, Horizontal };
private static readonly char[] all = new[] { Up, Horizontal, Down };
还有一个方便的小助手方法:

private static IList<char> GetAllPossibleDirectionsFrom(string path)
{
    if (path.Length == 0)
        return upOrHorizontal;

    switch (path.Last())
    {
        case Up: return upOrHorizontal;
        case Down: return downOrHorizontal;
        case Horizontal: return all;
        default:
            Debug.Assert(false);
            throw new NotSupportedException();
    }
}
我们准备好了!如果我们将其取出进行试驾:

var paths = GetSchroderPathsWithoutPeaks(2);
Console.WriteLine(string.Join(Environment.NewLine, paths));
我们得到了预期的结果:

URRD
URDR
RURD
RRRR

为什么你的解决方案不起作用?好吧,只是你不能弄明白这一事实说明了你目前的解决方案看起来有多么复杂。当这种情况发生时,通常最好退后一步,重新思考您的方法,一步一步地写下您的程序应该做什么的明确说明,然后重新开始。

感谢您提供的详细代码,但我仍然不明白是什么使我的代码出错?我是否在改变一些不应该改变的变量?另外,在我构造了正确的代码之后,我需要将其转换为javascript代码,这样所有这些类和方法都很难转换为javascript。@ayt_cem更新了,嗯……彻底修改了答案。感谢您提供了详细的代码,但我仍然不明白是什么原因使我的代码出错?我是否在改变一些不应该改变的变量?另外,在我构造了正确的代码之后,我需要将其转换为javascript代码,这样所有这些类和方法都很难转换为javascript。@ayt_cem更新了,嗯……彻底修改了答案。欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。显示给定情况下所需的输出、实际输出以及调试跟踪的结果。欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。显示给定情况下的所需输出、实际输出和调试跟踪的结果。