簡體   English   中英

程序中的運行時錯誤創建自己的冪函數

[英]Runtime error in program to create your own power function

好的,所以我正在閱讀程序來創建您自己的冪函數( 編寫一個C程序來計算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;
}

上面的程序給出了運行時錯誤

我無法弄清楚運行時錯誤的原因可能是什么。 誰能幫我嗎?

您從內部調用函數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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM