[英]Prime number recursive StackOverflowException
我想使用称为primzahlenRekursiv
的递归函数来计算素数,但是我在函数istPrimzahl
得到StackOverflowException
,在这里检查当前数是否为素数。
static void Main(string[] args)
{
primzahlenRekursiv(2);
}
static void primzahlenRekursiv(int primzahl)
{
if (istPrimzahl(primzahl, 2)) { Console.Writeline(primzahl); }
primzahlenRekursiv(primzahl + 1);
}
static bool istPrimzahl(int primzahl, int zahl)
{
if (primzahl % zahl != 0) { istPrimzahl(primzahl, zahl + 1); }
if (primzahl == zahl) { return true; }
return false;
}
您的递归代码中没有任何东西最终将结束递归:
static void primzahlenRekursiv(int primzahl)
{
if (istPrimzahl(primzahl, 2)) { Console.Writeline(primzahl); }
primzahlenRekursiv(primzahl + 1);
}
primzahlenRekursiv
始终会在没有任何条件的情况下自行进行调用。 由于任何方法调用都需要堆栈上的空间,因此算法将一直运行到堆栈用完为止。 因此,您的例外。
实际上,不需要递归运行算法:
for (var kandidat = 2; ; kandidat++) {
if (istPrimzahl(kandidat, 2)) { Console.Writeline(kandidat); }
}
这将使您的代码无休止地循环运行,而不会很快耗尽您的堆栈。 但是要小心,如果您的候选对象变得足够高(最终仍在 istPrimzahl
运行递归),最终您仍然会遇到堆栈溢出异常。 因此,最好将数字集(在此示例中为10000)约束为:
for (var kandidat = 2; kandidat < 10000; kandidat++) {
if (istPrimzahl(kandidat, 2)) { Console.Writeline(kandidat); }
}
另外,在代码中,由于另一个错误,递归未正确运行:
if (primzahl % zahl != 0) { istPrimzahl(primzahl, zahl + 1); }
...不使用递归调用的结果。 您可能是想在此处返回递归调用的结果。
另一个解决方案当然是尾部调用,但是C#不支持该方法(虽然IL会支持)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.