Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用置换和递归的有限性能_C#_Recursion_Permutation_Repeat - Fatal编程技术网

C# 使用置换和递归的有限性能

C# 使用置换和递归的有限性能,c#,recursion,permutation,repeat,C#,Recursion,Permutation,Repeat,我正在编写一个程序,它根据概率计算最长的条纹,并使用递归获得所有不同的可能场景。这是我正在做的编码挑战: 我注意到,由于递归,对于较大的输入,我使用的置换函数不是最有效的。示例输入为3,它将向matches数组添加以下内容: 000010001011100110101111 public static void Permutations(string text, int numberOfGames, List<String> matches) { if

我正在编写一个程序,它根据概率计算最长的条纹,并使用递归获得所有不同的可能场景。这是我正在做的编码挑战:

我注意到,由于递归,对于较大的输入,我使用的置换函数不是最有效的。示例输入为3,它将向matches数组添加以下内容: 000010001011100110101111

public static void Permutations(string text, int numberOfGames,     List<String> matches)
    {
        if (numberOfGames > 0)
            for (int j = 0; j < 2; j++)
                Permutations(text + j.ToString(), numberOfGames - 1, matches);
        else
        {
            matches.Add(text.ToString());
        }

    }
公共静态无效置换(字符串文本、int numberOfGames、列表匹配)
{
如果(numberOfGames>0)
对于(int j=0;j<2;j++)
排列(text+j.ToString(),numberOfGames-1,matches);
其他的
{
matches.Add(text.ToString());
}
}
我的问题在于较大的输入(例如500),因为这会导致程序崩溃并抛出错误:垃圾收集器无法为主堆部分分配16384字节的内存。 有没有其他方法可以改进这个递归,使它在更大的输入上运行得更好

谢谢你们

我的问题在于较大的输入(示例500)

您的程序试图生成包含2500个字符串的列表

宇宙中大约有2267个原子

我觉得你的内存不足并不奇怪

为你的问题找到一个更聪明的解决方案

记住,问题不是“列举所有可能的游戏组合”。问题是推断最长条纹长度的期望值。当组合数量变大时,生成所有可能的组合并汇总每个组合中最长条纹的长度将不起作用

还要记住,问题的陈述是,结果必须在精确结果的某个分数之内。它不一定是精确的结果。在处理这样的谜题时使用元推理:提出谜题的人可能不会放松问题,除非它是你可以利用的东西

这是否让你对如何解决这个问题有所了解

如果您需要更多提示和见解,请阅读以下内容:

我的问题在于较大的输入(示例500)

您的程序试图生成包含2500个字符串的列表

宇宙中大约有2267个原子

我觉得你的内存不足并不奇怪

为你的问题找到一个更聪明的解决方案

记住,问题不是“列举所有可能的游戏组合”。问题是推断最长条纹长度的期望值。当组合数量变大时,生成所有可能的组合并汇总每个组合中最长条纹的长度将不起作用

还要记住,问题的陈述是,结果必须在精确结果的某个分数之内。它不一定是精确的结果。在处理这样的谜题时使用元推理:提出谜题的人可能不会放松问题,除非它是你可以利用的东西

这是否让你对如何解决这个问题有所了解

如果您需要更多提示和见解,请阅读以下内容:


您应该添加详细信息,描述您遇到的异常+堆栈。为了让这个问题成为本文的主题,您需要告诉我们您的程序在哪里崩溃,以及是什么“较大的输入”导致它崩溃。每个赛季3000场。。rocksIt是崩溃的排列算法。输入的示例可能是500,概率可能是任何情况,比如0.4。提示:递归通常可以用迭代代替。您应该添加详细信息,描述遇到的异常+堆栈。要在这里讨论这个问题,您需要告诉我们您的程序在何处崩溃,以及什么是“较大的输入”使其崩溃。每个赛季3000场。。rocksIt是崩溃的排列算法。一个输入的例子可以是500,概率是多少,比如说0.4。提示:递归通常可以用迭代来代替。