2014-10-07 3 views
0
int g(int n) { 
     int x = g(n - 1); 
     if (x > 0) { 
      return x + 1; 
     } else { 
      return 1; 
     } 
    } 

내 생각에 함수의 첫 번째 줄과 관련이 있습니다 ...하지만 왜 그런지는 잘 모르겠습니다.왜이 재귀 함수가 충돌합니까?

+0

끝없는 재귀가되는 것처럼 보입니다. 일반적으로 하나 이상의 기본 사례를 확인하고, 그렇지 않은 경우 재귀 호출을합니다. – ChiefTwoPencils

+0

g (n)은 n의 값과 관계없이 g (n-1)을 호출하고 끝내지 않습니다. – lolando

답변

1

gdb과 같은 디버거를 통해 실행하면 실제로 종료되지 않습니다. 내 경우에는

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004004de in g (n=-240246) at test.c:10 

test.c:10 은 반복라는지고 유지하여 int x = g(n - 1); 라인입니다.

1

함수의 첫 번째 줄은 정확히 같은 함수를 호출하므로 '반환'이 실행되지 않습니다. 그러므로 '충돌'할 때까지 무한 루프입니다.

평가할 내용 : g(20) : g(19) : g(18) 등으로 전화하십시오.

재귀 호출은 종종 함수의 끝에서 호출되거나 적어도 재귀가 예제 코드에서와 같이 무한하지 않도록 평가 한 후에 호출됩니다.

+0

그래서 'if'문은 결코 보지 않을 것입니까? 첫 번째 줄에서 충돌이 발생합니까? – user3019324

+0

바로 첫 번째 줄을 지나치지 않습니다. 'if'에 중단 점이있는 디버거를 실행 해 봅니다. 결코 충돌하지 않습니다. 'g (n-1)'호출에서 중단 점이있는 디버거를 계속 실행하면 계속 충돌합니다. – DoubleYou

3

함수가 바로이 말했다 경우 :

int g(int n) { 
    return g(n - 1); 
} 

다음 당신은 분명이 일을 기대하지 않을 것이다, 그러나 당신이 스택 공간과 프로그램이 충돌이 부족할 때까지 대신 재귀를 유지한다. 함수에서 exit 조건 앞에 재귀를두면 기본적으로 정확하게 수행됩니다.

전에 전에 종료 테스트를 수행하도록 함수를 다시 작성해야 g()을 다시 호출해야합니다.

+0

자, 재귀 호출 전에 기본 케이스를 정의해야합니까? – user3019324

+1

@ user3019324 : C++이 어떻게 다르게 접근 할 수 있습니까? – cHao

관련 문제