2012-05-09 4 views
0

C++와 관련하여 질문이 있습니다. 그래서이 프로그램을 만들었습니다. 가능한 모든 조합을 계산하여 재귀 (9 루프 대신)를 사용하여 문제를 해결했습니다. 이것은 코드의 일부입니다 :순환 재시작 루프 (C++)

int used[9]; 
nMin=1000; 

void Combinations(int index) 
    { 
     if(index>8) 
     { 
     return; 
     } 
     for(int i=k;i<4;i++) 
     { 
     used[index]=i; 
     if (sum<nMin && Check())//Checks the solution 
     { 
      nMin = sum; 
      used[i]=0; 
      return; 
     } 
     else 
     { 
      Combinations(index+1); 
     } 
     } 
} 

for 루프는 재귀 호출이 반환 할 때마다 4 번 반복되어야합니다. 즉, 루프 변수는 0으로 설정됩니다. 어떻게 작동하는지, 현재 루프 변수 값을 저장해야합니까 아니면 다른 방법이 있습니까?

편집 : 자세한 정보와 답변을 보내 주셔서 감사합니다. 이 코드는 몇 가지 조정을 거친 후에 작동했습니다.

+0

"나는 그것이 작동하는 방법"이라는 질문이나 진술 이었습니까? – Joe

+0

uhm 무엇이'k'입니까? – Pierre

+0

'Combinations (index + 1)'을 호출 한 후'i'가 0으로 설정되었다는 불만이 있습니까? 그렇다면 어떻게 테스트하고 'i'의 다른 화신을 보지 않을 것이라고 확신합니까? –

답변

2

int i은 해당 함수 호출의 인스턴스에 대한 for 루프의 컨텍스트 내에 존재하는 지역 변수입니다. 동일한 함수에 대해 재귀 호출을 수행하면 스택에 해당 함수 호출의 새로운 인스턴스가 생성됩니다.이 인스턴스에는 고유 한 for 루프가 있고 int i 변수가 있습니다. 그들은 서로 연결되어 있지 않습니다. 당신이 카운터를 공유하는 기능에 대한 모든 재귀 호출을 원하는 경우에

, 당신은 정적 변수로 정의해야하며, 다음과 같이 for 루프의 범위를 외부에서 정의 :

void Combinations(int index) 
{ 
    static int persistentCounter; 

이것은 재귀 호출에서 값을 유지합니다.

2

정확하게 읽는다면 루프 변수 iCombinations에 대한 재귀 호출에 의해 보호/보존되는지 여부가 문제입니다.

대답은 입니다. 예, 루프 카운터의 값은으로 유지됩니다. 이유는 scope입니다. 함수가 호출 될 때마다 스택은 새 변수 i에 대한 공간을 현재 호출 범위로 만듭니다. 즉, 함수 호출 중에 i과의 모든 상호 작용은 특정 호출에 대해 i이 작성된 상태입니다.

참고 : C/C++ 언어 표준에는 스택에 대한 명시적인 개념이 없습니다. 이것은 실제로 자동 스토리지 구현을위한 구현 세부 사항입니다.