2014-11-23 100 views
1

我試圖實現一個數獨解算器。我調用方法printSoluition(板),它應該打印出的解決方案,如果存在或無效。返回掀起了靜態,遞歸Java方法不起作用

我與有一個解決方案的例子嘗試它。但它總是返回null。

我的代碼:

static void printSolution(SudokuBoard board) { 

    SudokuBoard resultBoard = findSolution(board); 

    if(resultBoard != null) { 
     resultBoard.print(); 
    } 
} 

static SudokuBoard findSolution(SudokuBoard board) { 

    if (board.isSolved()) { 
     return board; 

    } else { 

     int nextEmptyField = getNextFreeIndex(board); 

     if (nextEmptyField != -1) { 

      int[] kandidaten = board.getCandidates(nextEmptyField); 

      for (int i = 0; i < kandidaten.length; i++) { 

       SudokuBoard newBoard = board.set(nextEmptyField, 
         kandidaten[i]); 

       return findSolution(newBoard); 
      } 
     } 

     return null; 
    } 
} 

回答

2

你帶回溯執行遞歸是不正確的,因爲你的for循環永遠不會過去的第一候選人。

您需要更改的循環,只有當找到一個解返回:

for (int i = 0; i < kandidaten.length; i++) { 
    SudokuBoard newBoard = board.set(freiesNaechstesFeld, kandidaten[i]); 
    SudokuBoard solution = findSolution(newBoard); 
    if (solution != null { 
     return solution; 
    } 
} 

現在所有調用級別的所有候選人將受到審判,所以最後你最終會得到一個解決方案(假設中,當然,你的「幫手」的方法是找到並設置考生正常工作)。

+0

我不明白你的「因爲你的循環永遠不會過去的第一候選人」 ..你能描述一下它多一點,請 – mrbela 2014-11-23 21:17:26

+0

@ user2438518您當前的環有一個** **無條件'return'聲明在它裏面,這就是爲什麼它從來沒有真正迭代。所以,如果您在任何級別挑第一候選人不會導致一個解決方案,你一定會返回'null'。 – dasblinkenlight 2014-11-23 21:19:33