递归迷宫求解器问题

时间:2013-11-21 17:29:28

标签: java maze

我正在制作一个递归的Java迷宫程序,在调用我的子程序goNorth()goWest()goEast()和{{1}时,我会遇到困难。 }。基本上我的问题涉及它调用一个子程序的事实,但是在那个子程序中它不会接受我的其他if if else语句因此没有使它接受其他可能性。请帮助,我感谢你即将给出的答案。

goSouth()

抱歉,我无法在这里发布实际的迷宫,它不会显示正确。

1 个答案:

答案 0 :(得分:0)

我看到的问题:

  1. 正如其他人所说,你不应该做出一切static。无需进行超长且无聊的讨论,制作所有内容static意味着您在递归调用中设置的值将修改所有调用的值。您实际上使用在后续递归调用中设置的值来覆盖每个递归调用。您将希望创建大多数方法范围的变量,以便该值仅在该方法调用的范围内有效。
  2. 您的递归调用顺序不同。你需要每次在同一步骤中进行相同的呼叫:尝试北,然后是南,然后是东,然后是西。无论您选择哪种订单,电话都需要按相同的顺序排列。事实上,我不确定为什么你决定为每个方向都有单独的方法...为什么没有一个叫做“移动”的方法试图去北方,然后递归,然后试图去南方,然后递归,然后尝试去东方和recurses,然后西和recurses。你编写代码的方式,没有告诉代码将在迷宫中的哪个位置,并且很可能你最终会绕圈子进行。
  3. 这与它无法正常工作的原因没有直接联系,但您真的需要处理代码格式化,特别是您的标签。你的代码看起来就像是到处都是。我只能想象那就是让它更难以解决它需要的问题。
  4. 编辑 - 示例

    我会尝试这样做,以指导你而不给你一个复制/粘贴答案,所以这将是伪代码。

    /**
     * My move recursion
     */
    public boolean move(int currRow, int currCol) {
      // See if we solved it...
      if (solved) {
        return true;
      }
    
      // Try to go north first...
      if (maze[currRow-1][currCol] == '.') {
        if (move(int currRow-1, currCol)) {
          // Mark this with the "good" path and return true
        }
      }
    
      // Try to go east next...
      if (maze[currRow][currCol+1] == '.') {
        if (move(int currRow, currCol+1)) {
          // Mark this with the "good" path and return true
        }
      }
    
      // Try to go south next...
      if (maze[currRow+1][currCol] == '.') {
        if (move(int currRow+1, currCol)) {
          // Mark this with the "good" path and return true
        }
      }
    
      // Try to go west...
      if (maze[currRow][currCol-1] == '.') {
        if (move(int currRow, currCol-1)) {
          // Mark this with the "good" path and return true
        }
      }
    
      return false;
    }
    

    所以,基本上我们检查一下我们是否“解决了”。如果没有,看看我们是否可以北上。如果可以的话,看看下一个电话是否已经解决。重复东,南,西。最终其中一个递归调用将进入已解决的条件,这将触发每个递归调用以传递内部if,这标记了迷宫并返回true,从而产生链式反应,最终弹出调用堆栈直到你完成了递归。

    递归注意事项:

    1. 它通常需要是一个可以分解为一个或多个可重复的自主步骤的过程。这并不意味着它必须是一种方法,但如果它是多种方法,则必须以相同的顺序执行方法中的事物。否则,你的逻辑就会失去同步。
    2. 当您可以将“步骤”分解为最小,最卑微的部分时,它通常效果最佳。过于复杂的递归方法可以进行硬调试,还有很多疯狂的分支和循环。
    3. 你必须有一个非常清楚的“结束”,否则你会递归,直到你炸掉筹码。
    4. “方法级别”的变量/数据/信息与“全局”的事物之间应该有一个非常明确的区别。在您的情况下,迷宫是全球性的,成功和当前位置不是。