2014-07-16 2 views
1

확인을 자체 전원 기능을 만들 수 (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() 함수가 정확하면 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

두 번째 인수로 2를 전달하면 내부에서 power 함수를 호출하고 있습니다.

이것은 본질적으로 무한 재귀이며 결국 스택 오버플로이됩니다. 다음과 같이


사용자의 입력 인수는 음수가 아닌 정수 경우에, 당신은 그것을 구현할 수 있습니다 재귀

:에 반복적

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 : 감사합니다 :) –

관련 문제