2013-02-25 1 views
1

주어진 숫자의 계승을 계산하는 데 필요한 시간을 2 백만 번 표시하는 프로그램을 작성하고 있습니다. C/C++ Eclipse 환경에서 데비안 리눅스를 사용하여 작성했습니다. 프로그램이 int temp = n * rfact(n-1);에 도착하면 프로그램이 중단되고 다른 작업은 수행되지 않습니다.C에서 재귀 팩토리 프로그램이 실행될 때 응답하지 않는다

는 여기에 지금까지있어 무엇 : 당신은 무한 재귀으로 실행되도록

#include <stdio.h> 
#include <time.h> 

//prototypes 
int rfact(int n); 

main() 
{ 
    int n = 0; 
    int i = 0; 
    double result = 0.0; 
    clock_t t; 
    printf("Enter a value for n: "); 
    scanf("%i", &n); 

printf("n=%i\n", n); 

    //get current time 
    t = clock(); 

    //process factorial 2 million times 
    for(i=0; i<2000000; i++) 
    { 
     rfact(n); 
    } 

    printf("n=%i\n", n); 

    //get total time spent in the loop 
    result = (clock() - t)/(double)CLOCKS_PER_SEC; 

    //print result 
    printf("runtime=%d\n", result); 
} 

//factorial calculation 
int rfact(int n) 
{ 
    int temp = n * rfact(n-1); 
    printf(i++); 
    return temp; 
} 

답변

5

당신은, 기본 케이스가 누락되었습니다. 당신이 n == 1 또는 n == 0에 도착하면 당신은 중지해야합니다 반복 버전은 아마도 훨씬 빨리 틀림없이 더 읽을하기 때문에

int rfact(int n) 
{ 
    if (n <= 0) 
     return 1; 
    return n * rfact(n-1); 
} 

는 또한, 계승 기능은 정말 재귀에 가장 적합한 사용 사례되지 않습니다, 그러나 그것은이다 다른 이야기 :)

1

rfact 함수에는 기본 사례가 없습니다. 이것은 rfact (n-1)이 영원히 호출된다는 것을 의미합니다.

나는 저 위의 사람들이 동의
1

, 당신은 재귀

의 기본 케이스 누락 그러나 계승 2'000'000 번 일을 알고있다, 당신의 변수는 시간을 많이 복용 떨어져 오버플로 이동합니다 계산을 종료 할

+0

와우 큰 facepalm 그게 좋은 지적이야. – zakparks31191