无法弄清楚如何将回溯合并到我的psuedo-recursive方法中

时间:2012-04-17 13:59:44

标签: java recursion backtracking

这是一个数独求解器,每个方块都有这个方法。我的想法是,如果此方法的一个实例通过循环而没有找到任何有效值,它将返回到调用它的前一个方法并继续循环 - 尝试从for循环中的下一个值。我希望这足以回溯,但我所有的测试都失败了,我完全无法理解我将如何解决这个问题。 / end noob-lament

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;
}

3 个答案:

答案 0 :(得分:2)

这里有两个正确性问题:

  1. 你应该检查递归调用的结果是true - 如果是,你应该停止递归 - 你找到了解决方案,不要覆盖它!
  2. 你应该夸大递归的返回值,特别是 - 如果getNext().recursive();产生true - 你应该将此true冒出来[并且如(1)所述 - 停止递归,你有一个解决方案!]

答案 1 :(得分:1)

好的 - 所以既然我的同伴帮助我解决了这个问题,并设法让我了解遗漏的内容,我想我想在这里分享一下,以防有人有兴趣知道遗失了什么。

循环完成后,该方法需要重置其值。如果不是,那么之前在回溯之前测试的旧值将在回溯之后保留。这意味着当isValid()方法检查给定方块所属的列,行和方框时,isValid()方法会找到之前设置的大量值。

所有需要的是'return false'之前的一行;

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

答案 2 :(得分:0)

你要两次调用getNext()。如果它在if语句中没有返回null,则再次调用它。你确定要这么做吗?