2012-04-17 3 views
0

이것은 스도쿠 - 솔버를위한 것으로 각 사각형마다이 방법이 있습니다. 내 생각에이 메서드의 한 인스턴스가 유효한 값을 찾지 않고 루프를 통과하면 for 루프에서 다음 값을 사용하여 루프를 호출 한 이전 메서드로 돌아가서 루프를 계속 진행합니다. 나는 이것이 역 추적을 위해 충분할 것이기를 바랬지 만, 나의 모든 시험은 실패하고 어떻게 내가이 문제를 해결할 것인가에 관해서는 완전히 단서가 없다./종료 멍청한 놈-애도 여기가짜 재귀 적 방법으로 역 추적을 통합하는 방법을 알 수 없습니다.

public boolean recursive() { 

    for(int i = 1; i <= boardSize; i++) { 

     if(!validValue(i)) { 
      continue; 
     } else { 
      setValue(i); 

      if(getNext() == null) // This signifies that I am at the end of the list 
       return true; 
      else 
       getNext().recursive(); // same method in the next sudoku square 
     } 
    } 

    return false; 
} 
+0

이 코드는 무슨 일이 벌어지는 지보기에 충분하지 않습니다. 알고리즘의 구조는 무엇이며'validValue','setValue','getNext','recursive'는 무엇을합니까? 내가 틀린 것을 자신있게 말할 수는 없지만, 내 추측은 당신이 역 추적 중 변경 사항을 취소하지 않는다는 것입니다. 검색이 솔루션을 찾지 못하면 역 추적하기 전에 변경된 영구 상태를 재설정해야합니다. – Heatsink

+0

죄송합니다. 메소드 이름이 자명하다는 생각이 들었습니다. validValue (i)는 정사각형과 관련된 box/row/column에 i가 있는지를 확인합니다. setValue()는 각 사각형의 값을 설정하는 것입니다. getNext()는 스도쿠 보드에서 다음 사각형을 반환합니다. 이걸 보지 못해서 미안하지만 setValue() 메서드가 잘못된 값을 덮어 쓰는 경우 값을 다시 설정해야하는 이유는 무엇입니까? – jollyroger

+0

그러면 귀하의 경우와 관련이 없을 것입니다. 일부 검색 알고리즘에서 재귀 인스턴스는 이전 단계의 추측을 덮어 쓸 수 있습니다. 각 재귀 인스턴스는 알고리즘에서 데이터의 개별 부분을 수정하기 때문에 실행 취소는 중요하지 않습니다. – Heatsink

답변

2

두 정확성 문제 :

  1. 재귀 invokation의 결과가 true 있다면 당신은 확인해야합니다 -하고 있는지, 당신은 재귀를 중지해야 - 당신은 발견 해결책, 그것을 무시하지 마라!
  2. 당신이해야 특히 버블 재귀의 반환 값을, - 경우 getNext().recursive(); 수익률 true - 당신이이 true 거품한다 [하고 말했다 (1) -, 당신은 해결책을 가지고 재귀를 중지!]
+0

귀중한 의견을 보내 주셔서 감사합니다. 귀하의 의견을 반영하기 위해 위의 코드를 편집했지만, 나는 눈이 멀어서이 코드를 찔렀다는 느낌이 들었습니다. 나는 재귀 함수가 어떻게 작동 하는지를 이해한다고 믿지만, 그것은 나에게 문제를주는 것처럼 보이는 구현 부분이다. 위의 편집 내용이 귀하의 조언을 반영합니까, 아니면 완전히 취소 되었습니까? – jollyroger

+0

@jollyroger : 해결 된 문제를 해결합니다. 지금 올바른지 모릅니다. 또한 : 다른 사람들도 그걸 배울 수도 있기 때문에 코드를 원래 코드로 되돌릴 것입니다! 코드가 여전히 실패하는 경우 코드가 실패한 방법과 이유를 설명하는 새 질문을 게시해야합니다. – amit

+0

도움 주셔서 감사합니다. – jollyroger

0

getNext()를 두 번 호출하고 있습니다. if 문에서 null을 반환하지 않으면 다시 호출합니다. 정말하고 싶니?

1

OK - 동료 동료가 나를 도와 주었기 때문에 실종 된 내용을 이해할 수있게되었으므로 누군가가 무엇을 알기를 원한다면 여기에서 공유하고 싶습니다. 있어야 할 곳에 없는.

루프가 완료된 후에 메서드는 값을 다시 설정해야합니다. 그렇지 않으면 이전에 테스트 한 이전 값이 백 트랙 전에 남았습니다. 즉, isValid() 메서드가 주어진 사각형이 속한 열, 행 및 상자를 검사 할 때 isValid() 메서드는 이전에 많은 값을 찾았을 것입니다.

필요한 것은 'return false;

//(end of for-loop) 
setValue(0); 
return false; 
//(method ends)