Java 无法理解如何将回溯合并到我的psuedo递归方法中
这是一个数独解算器,每个方块都有这个方法。我的想法是,如果此方法的一个实例在循环中没有找到任何有效值,它将返回到调用它的前一个方法并继续循环-尝试for循环中的下一个值。我希望这足以回溯,但我所有的测试都失败了,我完全不知道如何解决这个问题/尾声哀叹Java 无法理解如何将回溯合并到我的psuedo递归方法中,java,recursion,backtracking,Java,Recursion,Backtracking,这是一个数独解算器,每个方块都有这个方法。我的想法是,如果此方法的一个实例在循环中没有找到任何有效值,它将返回到调用它的前一个方法并继续循环-尝试for循环中的下一个值。我希望这足以回溯,但我所有的测试都失败了,我完全不知道如何解决这个问题/尾声哀叹 public boolean recursive() { for(int i = 1; i <= boardSize; i++) { if(!validValue(i)) { continu
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;
}
公共布尔递归(){
对于(int i=1;i这里的两个正确性问题:
您应该检查递归调用的结果是否为true
——如果是,您应该停止递归——您已经找到了解决方案,不要覆盖它
您应该冒泡递归的返回值,特别是-如果getNext().recursive();
产生true
-您应该冒泡这个true
向上[如(1)中所述-停止递归,您有一个解决方案!]
这里有两个正确性问题:
您应该检查递归调用的结果是否为true
——如果是,您应该停止递归——您已经找到了解决方案,不要覆盖它
您应该冒泡递归的返回值,特别是-如果getNext().recursive();
产生true
-您应该冒泡这个true
向上[如(1)中所述-停止递归,您有一个解决方案!]
您调用了两次getNext()。如果它在If语句中没有返回null,您将再次调用它。确实要这样做吗?您正在调用getNext()两次。如果If语句中没有返回null,请再次调用它。你确定要这样做吗?好的-既然我的一位同事帮我解决了这个问题,并设法让我了解了遗漏的内容,我想我想在这里分享一下,以防有人有兴趣知道遗漏了什么
循环完成后,该方法需要重置其值。如果不是,则在回溯之前测试的旧值将保留在回溯之后。这意味着当isValid()方法将选中给定正方形所属的列、行和框时,isValid()将方法将查找以前设置的许多值
只需要在“return false;”之前加一行
//(end of for-loop)
setValue(0);
return false;
//(method ends)
好吧,既然我的一位同事帮我解决了这个问题,并设法让我了解了遗漏的内容,我想我想在这里分享一下,以防有人有兴趣知道遗漏了什么
循环完成后,该方法需要重置其值。如果不是,则在回溯之前测试的旧值将保留在回溯之后。这意味着当isValid()方法将选中给定正方形所属的列、行和框时,isValid()将方法将查找以前设置的许多值
只需要在“return false;”之前加一行
//(end of for-loop)
setValue(0);
return false;
//(method ends)
这段代码实际上不足以看到发生了什么。算法的结构是什么,以及validValue
、setValue
、getNext
、和recursive
做了什么?虽然我不能肯定地说什么是错的,但我猜您在回溯过程中没有撤消更改。当搜索失败时如果要找到解决方案,它应该重置在回溯之前已更改的任何持久状态。抱歉,我做了一个错误的假设,认为方法名称是自解释的。validValue(I)检查是否在与正方形相关的框/行/列中找到了I。setValue()是每个正方形中值的setter。getNext()返回数独板上的下一个方块。很抱歉没有看到这一点,但是如果方法setValue()的值只会覆盖任何错误的值吗?那么它可能与您的情况无关。在某些搜索算法中,递归实例可以覆盖前面步骤所做的猜测。由于每个递归实例都会修改算法中单独的一段数据,所以撤消并不重要。此代码实际上不足以查看发生了什么。什么这是算法的结构,以及validValue
、setValue
、getNext
和recursive
做了什么?虽然我不能肯定地说是哪里出了问题,但我猜您在回溯过程中并没有撤消更改。当搜索无法找到解决方案时,它应该重置它的任何持久状态在回溯之前已更改。抱歉,我做了一个错误的假设,认为方法名称是自解释的。validValue(I)检查是否在与正方形相关的框/行/列中找到了I。setValue()是每个正方形中的值的setter。getNext()返回数独板上的下一个方块。很抱歉没有看到这一点,但是如果方法setValue()的值只会覆盖任何错误的值吗?那么它可能与您的情况无关。在某些搜索算法中,递归实例可以覆盖前面步骤所做的猜测。由于每个递归实例都会修改您算法中的一个单独的数据段,所以撤消并不重要。感谢您宝贵的输入。我已经编辑了代码ab我很想反映你的意见,但作为我的noob,我觉得我是在瞎捅这一刀。我相信我理解递归函数是如何工作的,但它的实现部分似乎给我带来了麻烦。我上面的编辑是否反映了你的建议,还是我完全错了?@jollyroger:它解决了我解决的问题-我不知道如果它现在是正确的。另外:我正在将代码还原为原始代码,因为其他人可能也会从中学习!如果代码仍然失败,您应该发布一个新问题,描述代码失败的方式和原因。感谢您宝贵的输入。我有