2013-08-29 2 views
0

이것은 오일러 # 60을 해결하려고하는 재귀 솔버입니다. http://projecteuler.net/problem=60 솔버가 실행되지만 마지막 배열 멤버에 대한 솔루션을 찾을 수 없으므로 역 추적이 가능합니다. 그러나 첫 번째 배열 멤버로 되돌아 가면 루프가 끝까지 실행됩니다. 아무도 내게 자리를 물려서 다음 주요한 시점에서 멈추지 않는 이유는 무엇일까요?재귀가 제대로 작동하지 않음

아래의 솔버 기능을 게시했습니다. 다른 함수 (Concat check)는 제대로 작동하고 부분적으로 채워진 배열에 대해 true를 반환합니다.

int Solver (int primes[5]) 
{ 
    int i=1; 
    int x=0; 

    while (primes[x]!=0) {++x;} //work on the next one 

    if ((x>5) && Concat_Check(primes)) {return 1;} //solved array 

    for (i=3; i<=SIZE; i++) //try each value, if successful, return true 
    { 
     if (Is_Prime(i)) {primes[x]=i; cout<<"primes["<<x<<"] = "<<i<<endl;} 
     if ((Concat_Check (primes)) && Solver (primes)) {return 1;} 
    } 
    primes[x-1] = 0; 
    return 0; 
} 

답변

0

난 당신의 코드에서 재귀의 목적을 얻을 수는, 어쨌든 루프 ... 보인다, 어쩌면 당신은 루프에서 x을 증가하는 것을 잊었다 및 테스트가 완료되지 않은 것 같다.

for (i=3; i<=SIZE; i+=2) //try each value, if successful, return true 
{ 
    if (Is_Prime(i)) { 
    primes[x++]=i; cout<<"primes["<<x<<"] = "<<i<<endl;} 
    if ((Concat_Check (primes)) && Solver (primes)) {return 1;} 
    } 
} 
+0

내가 찾은 다음 소수는 이제 작동하지만 궁극적으로 솔루션으로 끝나기 때문에 재귀가됩니다. 나는 당신의 이중 증가 아이디어를 좋아한다 - 심지어 짝수에 루프를 낭비하지 말라! –

관련 문제