【发布时间】:2017-03-24 11:15:53
【问题描述】:
我正在编写一个程序,该程序根据它们的概率计算最长的条纹,并使用递归来获得所有不同的可能场景。这是我正在做的编码挑战:https://open.kattis.com/problems/winningstreak
我注意到,由于递归,当涉及到更大的输入时,我所拥有的置换函数并不是最有效的。示例输入为 3,它会将以下内容添加到匹配数组中: 000, 010, 001, 011, 100,110,101,111
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());
}
}
我的问题在于较大的输入(例如 500),因为这会导致我的程序崩溃并引发错误:垃圾收集器无法为主要堆部分分配 16384 字节的内存。 有没有其他方法可以改进这种递归,使其在更大的输入上运行得更好?
谢谢你们!
【问题讨论】:
-
您应该添加描述您遇到的异常+堆栈的详细信息。
-
为了让这个问题成为这里的主题,您需要告诉我们您的程序在哪里崩溃,以及哪些“较大的输入”导致它崩溃。
-
每个赛季 3000 场比赛.. 震撼
-
是排列算法崩溃了。输入的示例可以是 500 和任何概率,比如说 0.4。
-
提示:递归通常可以用迭代代替。
标签: c# recursion permutation repeat