Java 无法理解如何将回溯合并到我的psuedo递归方法中

Java 无法理解如何将回溯合并到我的psuedo递归方法中,java,recursion,backtracking,Java,Recursion,Backtracking,这是一个数独解算器,每个方块都有这个方法。我的想法是,如果此方法的一个实例在循环中没有找到任何有效值,它将返回到调用它的前一个方法并继续循环-尝试for循环中的下一个值。我希望这足以回溯,但我所有的测试都失败了,我完全不知道如何解决这个问题/尾声哀叹 public boolean recursive() { for(int i = 1; i <= boardSize; i++) { if(!validValue(i)) { continu

这是一个数独解算器,每个方块都有这个方法。我的想法是,如果此方法的一个实例在循环中没有找到任何有效值,它将返回到调用它的前一个方法并继续循环-尝试for循环中的下一个值。我希望这足以回溯,但我所有的测试都失败了,我完全不知道如何解决这个问题/尾声哀叹

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:它解决了我解决的问题-我不知道如果它现在是正确的。另外:我正在将代码还原为原始代码,因为其他人可能也会从中学习!如果代码仍然失败,您应该发布一个新问题,描述代码失败的方式和原因。感谢您宝贵的输入。我有