2016-01-24 83 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的原始类型。固定。 –