2014-07-16 85 views
1

好了,所以我讀的程序來創建這裏給出你自己的冪函數(Write a C program to calculate pow(x,n)運行時錯誤來創建自己的電源功能

我讀它,它使用此函數計算功耗第1種方法:

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; 
} 

上述計劃爲運行時錯誤

什麼可能是運行時錯誤的原因,我無法弄清楚。任何人都可以幫助我嗎?

+0

您傳遞給此函數的輸入是什麼?當然,提供完整的程序本來很容易,所以我們不必猜測。 –

+0

@DavidHeffernan更新 – Jerky

+2

堆棧溢出,因爲您從內部調用函數'power',將第二個參數傳遞爲'2'。 –

回答

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; 
} 
+0

對於三種方法,+1 – ryyker

+0

@ryyker:謝謝:) –