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

Chi*_*izx -3 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,我只是说result=pow2(1,1000);,然后使用Stopwatch对象计时,然后在结尾打印结果.不幸的是,当我运行此程序时,我收到以下错误:由于StackOverflowException,进程终止.为什么会这样,我怎么能阻止它呢?

shf*_*301 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));
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

return pow2 (x, 0) * pow2 (x, 1);
Run Code Online (Sandbox Code Playgroud)

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