程序中的运行时错误,以创建自己的电源功能

时间:2014-07-16 15:23:02

标签: c math runtime-error

好的,所以我正在阅读程序,以创建您自己的幂函数(Write a C program to calculate pow(x,n)

我读了第一种使用此功能计算功率的方法:

int power(int x, unsigned int y)
{
    if( y == 0)
        return 1;
    else if (y%2 == 0)
        return power(x, y/2)*power(x, y/2);
    else
        return x*power(x, y/2)*power(x, y/2);

}

我得到了这个程序的概念,它给出了正确的结果。

现在,此处power(x, y/2)*power(x, y/2)已写入,因此我们只计算power(x,y/2)的平方。因此,如果我的power()函数是正确的,那么我可以将其更改为power(power(x,y/2),2)。也就是说,我们只是计算power(x,y/2)的平方。

所以,当我将程序更改为:

int power(int x, unsigned int y)
{
    if( y == 0)
        return 1;
    else if (y%2 == 0)
        return power(power(x, y/2),2);   // Square of power(x,y/2)
    else
        return x*power(power(x, y/2),2);   // x*Square of power(x,y/2)

}
int main()
{
    int x = 2;
    unsigned int y = 3;

    printf("%d\n", power(x, y));
    return 0;
}

上述程序提供运行时错误

导致运行时错误的原因可能是我无法弄清楚的。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:4)

你从内部调用函数power,传递2作为第二个参数。

这实际上是一个无限递归,最终会导致堆栈溢出


如果您的输入参数是非负整数,那么您可以按如下方式实现它:

<强>递归:

unsigned long long power(unsigned long long x,unsigned int y)
{
    if (y == 0)
        return 1;
    return power(x,y/2)*power(x,y-y/2);
}

<强>迭代:

unsigned long long power(unsigned long long x,unsigned int y)
{
    unsigned long long res = 1;
    while (y--)
        res *= x;
    return res;
}

<强>高效:

unsigned long long power(unsigned long long x,unsigned int y)
{
    unsigned long long res = 1;
    while (y > 0)
    {
        if (y & 1)
            res *= x;
        y >>= 1;
        x *= x;
    }
    return res;
}