为什么这个电源功能导致堆栈溢出c#

时间:2015-02-19 04:09:06

标签: c# stack-overflow

我有以下用c#编写的幂函数:

public static double pow2(double x, double n)
{
    if (n == 0)
        return 1;
    else
    {
        stepAccumulator++;
        return pow2 (x, Math.Floor (n / 2.0)) * pow2 (x, Math.Ceiling (n / 2));
    }
}

当我运行程序时,我只需说result=pow2(1,1000);然后使用Stopwatch对象计时,然后在结尾打印结果。不幸的是,当我运行这个程序时,我收到以下错误:由于StackOverflowException ,进程终止。为什么会发生这种情况?如何阻止它呢?

1 个答案:

答案 0 :(得分:5)

Math.Ceiling(n/2) pow案件永远不会n == 0 Math.Ceiling(1/2) == 1 pow2。使用n == 1调用return pow2 (x, Math.Floor (1 / 2.0)) * pow2 (x, Math.Ceiling (1 / 2)); 后,接下来的两个电话将是:

return pow2 (x, 0) * pow2 (x, 1);

与以下内容相同:

pow2

这导致另一次调用n == 1 {{1}},因此您的算法永远不会终止