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