返回一个静态的,递归的Java方法不起作用

时间:2014-11-23 21:09:08

标签: java recursion

我尝试实现一个Sudoku-Solver。我正在调用printSoluition(board)方法,它应该打印出解决方案,如果存在或为null。

我正在尝试一个有一个解决方案的例子。但它总是返回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;
    }
}

1 个答案:

答案 0 :(得分: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;
    }
}

现在所有调用级别的所有候选人都会被尝试,所以最终你会得到一个解决方案(当然,假设找到并设置候选人的“帮助者”方法工作正常)。