0

这是一个数独求解器,每个方块都有这个方法。我的想法是,如果此方法的一个实例通过循环而没有找到任何有效值,它将返回到调用它的上一个方法并继续循环 - 尝试来自 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;
}
4

3 回答 3

2

这里有两个正确性问题:

  1. 您应该检查递归调用的结果是否是true- 如果是,您应该停止递归 - 您找到了解决方案,不要覆盖它!
  2. 你应该冒泡递归的返回值,特别是 - 如果getNext().recursive();收益率true- 你应该把它冒泡true[并且如(1)中所说 - 停止递归,你有一个解决方案!]
于 2012-04-17T14:07:17.137 回答
1

好的 - 因此,由于我的一位同行帮助我解决了这个问题并设法让我了解缺少什么,我想我想在这里分享它,以防有人有兴趣知道缺少什么。

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

所需要的只是在“return false”之前的一行;

//(end of for-loop)  
setValue(0);  
return false;  
//(method ends)
于 2012-04-21T21:20:42.400 回答
0

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

于 2012-04-17T14:09:36.933 回答