2013-03-03 9 views
-2

이 코드의 잘못된 점은 무엇입니까? 이것은 내가하는 일의 단순화 된 버전입니다. 그것은 동일한 변수에 대한 재귀 함수 호출입니다.참조로 전달

#include <iostream> 

using namespace std; 
void Foo(int& x) 
{ 
    x++; 
    Foo(x); 
    cout<<x<<"\n"; 
    if(x==10) 
     return; 
} 

int main() 
{ 
    int x=0; 
    Foo(x); 
    return 0; 
} 
+4

글쎄, **이 코드에는 ** 잘못된 점이 있습니까? –

+7

종료 조건은 재귀 호출 전 *이어야합니다. 안돼. – WhozCraig

+1

나는 당신의 코드가 무엇을하는지 정확히 알기 위해 디버거에서이 알고리즘을 밟아 본 적이 없다고 생각한다. 네가 그렇게했다면, 아마 알아 냈을거야. – franji1

답변

3

이 기능은 종료 조건이없는, 그냥 무한 재귀 설정하려고, 무조건 자신을 호출 : 각 함수 호출에 대한 스택 프레임이 일부 메모리 공간을 차지하기 때문에

void Foo(int& x) 
{ 
    x++; 
    Foo(x); // <==== UNCONDITIONALLY RECURSIVE 
    cout<<x<<"\n"; 
    if(x==10) 
     return; 
} 

을, 무한 재귀가 불가능합니다. 조만간 스택이 제한 크기를 초과하여 커지며 프로그램이 강제 종료됩니다.

+1

... 스택 공간이 부족합니다. 그렇지 않으면 영원히 돌아갈 것이라고 생각할 수도 있습니다. –

+0

@JohnZwinck : 맞습니다. 나는 그것을 당연한 것으로 생각했다. 편집 됨, 감사합니다. –

3
x++; 
Foo(x); 
cout<<x<<"\n"; 
if(x==10) 
    return; 

문제는 무한 재귀가 발생한다는 것입니다. 다음에 if (x == 10)을 체크하면 함수가 스스로를 호출하므로 리턴 조건에 도달 할 수 없습니다. 이 문제를 작성하여 수정하십시오.

x++; 
if(x==10) 
    return; 

Foo(x); 
cout<<x<<"\n"; 
1

무한 재귀가 있습니다. 스택 공간이 다 소모 될 때까지 스택 프레임을 계속 생성합니다. 재귀 호출 전에 exit guard가 필요합니다.

void Foo(int& x) 
{ 
    cout<<x<<"\n"; 
    if(x==10) 
     return; 
    x++; 
    Foo(x); 
}