2016-01-24 51 views
0

我正在計算x的功率提升到n。我無法理解一件事:當我在開始時聲明和初始化臨時變量時,爲什麼會顯示分段錯誤?我知道分段故障是什麼,但爲什麼會出現。計算功率提高到

#include<stdio.h> 

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

//Driver function 
int main(int u, int v) 
{ 
printf("Enter the value of u and v"); 
scanf("%d %u",&u,&v); 
printf("%d",power(u,v)); 

return 0; 
} 
+0

你永遠不會得到儘可能'如果(Y == 0)',所以你一直在呼喚'電力(X,0)'直到你運行我們的堆棧。 –

+2

int power(int x,unsigned int y) int temp = power(x,y/2);' 導致無限遞歸。 –

+2

這是'main'函數的一個不同尋常的定義。它通常像'int main(int argc,char ** argv)'。你確定你的實現允許這樣一個'main'的定義(儘管可能不是你的segv的原因,它更可能是一個遞歸堆棧溢出,如上面評論中所述)? – kaylum

回答

8

您將無限遞歸。你需要一個小的調整[請原諒無償風格清理]:

#include <stdio.h> 

int 
power(int x, unsigned int y) 
{ 
    //int temp = power(x, y/2); 

    if (y == 0) 
     return 1; 

    int temp = power(x, y/2); 

    if (y % 2 == 0) 
     return temp * temp; 
    else 
     return x * temp * temp; 
} 

// Driver function 
int 
main(int argc,char **argv) 
{ 
    int u; 
    unsigned int v; 

    printf("Enter the value of u and v"); 
    scanf("%d %u", &u, &v); 

    printf("%d\n", power(u, v)); 

    return 0; 
} 
+1

另外,'int v;'應該是'unsigned int v;' –

+0

@CoolGuy是的。我把u/v作爲主要參數進行了清理,但保留了OP的原始類型。固定。 –