문제

C : Tail Recursive Factorial 구현을 고려하십시오.

#include <stdio.h>

unsigned long long factorial(unsigned long long fact_so_far, unsigned long long count, unsigned long long max_count){

if (max_count==0 || max_count==1 || count >= max_count)
        return fact_so_far;
else
{
        printf("%llu  %p \n", count, &factorial);
        return factorial(fact_so_far * count, ++count, max_count);
}

}


int main(int argc, char **argv)
{
        unsigned long long n;
        scanf("%llu", &n);
        printf("\n Factorial %llu \n",factorial(1,0,n));
        return 0;

}

나는 'factorial'에 중단 점을 놓고 위의 'GDB'아래에서 실행합니다. 중단 점은 결코 치지 않습니다.

테일 호출이 최적화되었다고 가정하면 (GCC -O2를 사용하여 컴파일 했음), IIRC (IIRC)는 한 번의 중단 점에 도달해야합니다.

편집 : 중단 점을 누르지 않고 최종 결과를 얻습니다. 예를 들어,

(gdb) b factorial
Breakpoint 1 at 0x8048429: file factorial-tail.c, line 3.
(gdb) run
Starting program: /home/amit/quest/codes/factorial-tail 
5
0  0x8048420 
1  0x8048420 
2  0x8048420 
3  0x8048420 
4  0x8048420 

 Factorial 120 

Program exited normally.
(gdb) 

내가 어디로 잘못 가고 있습니까?

도움이 되었습니까?

해결책

계승 기능이 메인으로 인한 것일 수 있습니다. 이 경우 다른 .C 파일의 통화에 사용 된 Factorial의 두 번째 사본이 있습니다. 그것이 당신의 중단 점이었던 곳입니다. -fno -inline을 통과 해보세요.

다른 팁

나를 위해 잘 작동합니다. 컴파일 할 때 디버그 정보를 추가하기 위해 -g 플래그를 사용하도록 구성하고 있습니까? 그리고 당신은 계승을 계산하기 위해 숫자를 입력해야한다는 것을 기억하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top