2011-01-12 5 views
2

그래서 전역 변수 var_와 재귀 함수가있는 경우 :재귀 함수의 전역 변수를 0으로 유지하는 방법은 무엇입니까?

int var_; 

void foo() 
{ 
    if(var_ == 3) 
    return; 
    else 
    var_++; foo(); 
} 

다음 내가 foo는 (호출하는 기능이) 너무 :

void bar() 
{ 
    foo(); 
    return; 
} 

var_를 설정하는 가장 좋은 방법이 무엇인지 = 0 매번 foo는 그 자체 내에서가 아니라 호출됩니다.

void bar() 
{ 
    var_ =0; 
    foo(); 
    return; 
} 

하지만 난 재귀 함수를 많이 사용하고 있는데 나는 foo에 전화를하고 나중에 var_ = 0을 설정하는 것을 잊지하고 싶지 않은 : 나는 다만 수 알고있다.

누구든지 해결 방법에 대한 제안 사항이 있습니까?

감사합니다, 조쉬

답변

6

도우미 함수로 전환 foo().

void foo() { 
    var_ = 0; 
    foo_helper(); 
} 

void foo_helper() { 
    if(var_ == 3) 
     return; 
    else 
     var_++; foo_helper(); 
} 

당신은 기존 코드를 변경할 필요가 없습니다, 당신은 여전히 ​​foo()를 호출하고 그것의 작업을 수행하도록 할 수 있습니다. 나는 초기화 기능으로 foo()을 분할 할

+0

입력 해 주셔서 감사합니다.이 또한 제가 생각한 것입니다.하지만보다 세련된 솔루션이 있는지 궁금합니다. – Grammin

3

, 그리고 진정한 재귀 함수 :

void foo() 
{ 
    var_ = 0; 
    foo_recur(); 
} 

void foo_recur() 
{ 
    if(var_ == 3) 
    return; 
    else 
    var_++; foo_recur(); 
} 
1

당신이있어 처음 두 (놀라 울 정도로 유사) 답변에 추가하려면, 만 푸() 메서드를 볼 수 있도록 클래스 밖에서 foo_helper()/foo_recur()를 private (var_는 private이어야 함)로 유지하십시오. 다중 스레드 환경에서 사용하려는 경우 foo()를 동기화해야합니다.

또한 "var_"을 인스턴스 변수 또는 클래스 변수 ("전역"대신)라고 부르는 것이 좋습니다.

+0

항상 좋은 제안입니다. 나는 그의 요구 사항을 잘 모르겠다. 그래서 맞는 지 확신 할 수는 없지만, 모두 주목해야 할 좋은 것들이다. +1 – Ktash

1

실제로이 전역 변수가 필요합니까? 이 재귀의 깊이를 제어하는 ​​데에만 사용되는 경우 다음과 같이

, 당신은 더 우아한 방법으로 그것을 다시 작성할 수 있습니다 :

void foo() { 
    fooHelper(0); 
} 

void fooHelper(int var) { 
    if (var == 3) return; 
    else fooHelper(var + 1); 
} 
+0

입력 해 주셔서 감사합니다. 그러나 var는 깊이를 제어하는 ​​것이 아니며 특정 노드와 XML 구조를 일치시켜야합니다. – Grammin

1

기능이 자체 내에서 호출되었는지 여부를 알려하려면 추가 할 수 있습니다 매개 변수 :

int var_; 

void foo(boolean from_itself) 
{ 
if(!from_itself) 
    var_ = 0; 
if(var_ == 3) 
    return; 
else 
    var_++; foo(true); // from within itself 
} 

void bar() 
{ 
foo(false); // not from within itself 
return; 
} 

그래서이 방법은 도우미 기능을 추가 할 필요가 없습니다.

관련 문제