【发布时间】:2011-05-05 15:16:59
【问题描述】:
我将伪代码here 转换为 C#,并让它递归重复 10,000 次。但是我在9217 次之后得到一个 C# 运行时错误,StackOverflow Exception。我怎样才能防止这种情况发生?
编辑如果对任何人有帮助,代码如下:
private double CalculatePi(int maxRecursion)
{
return 2 * CalculatePi(maxRecursion, 1);
}
private double CalculatePi(int maxRecursion, int i)
{
if (i >= maxRecursion)
return 1;
return 1 + i / (2.0 * i + 1) * CalculatePi(maxRecursion, i + 1);
}
double pi = CalculatePi(10000); // 10,000 recursions
EDIT2 所以每个人似乎都同意我需要将其转换为迭代...有人可以提供一些代码吗?我似乎无法编写任何有效的迭代代码......
编辑感谢 Paul Rieck 提供的这个答案,我对其进行了测试,并且有效:
private static double CalculatePi(int maxRecursion)
{
double result = 1;
for (int i = maxRecursion; i >= 1; i-- )
{
result = 1 + i / (2.0 * i + 1) * result;
}
return result * 2;
}
【问题讨论】:
-
编译器将在编译期间显示错误或警告。你得到一个 runtime 异常。你能发布确切的异常细节吗?
-
将迭代次数从 10000 更改为 51。您会得到相同的结果。 :)
-
不,实际上。我可以将迭代设置为 1 到 9216 之间的任何位置,而不会出现异常。
-
@TheAdamGaskins:你没有抓住重点。我的意思是你不需要使用 10000 次递归。 51 及以上的任何值都会给出相同的结果。最后的 9949 次递归是无用的,因为它们的贡献超出了
double的精度。 -
msdn.microsoft.com/en-us/library/s1ax56ch(v=VS.80).aspx 或者,您可以使用十进制,但您可能必须调整调用方以使用该值。有关更多信息,请参阅上面链接的参考。