基本递归回溯(机器人2D寻路)

时间:2013-06-24 19:18:21

标签: java

我正在解决练习问题而且陷入困境。该问题要求编写一个方法,该方法采用两个整数x和y来打印所有在2D平面中从(0,0)到(x,y)行进的解决方案,重复使用三个移动中的一个:

  • 向右移动1(E)
  • 向上移动1(N)
  • 向右移动1向上1(NE)

以下是一些示例调用:

  • 致电:旅行(2,1)
  • 输出:E E N // E N E // E NE // N E E // NE E

我写了以下代码:

public void travel(int x, int y) {
    if (x == 0 && y == 0) {
        System.out.println();
    } else if (x > 0 && y > 0) {
        System.out.print("E ");
        travel(x-1, y);
        System.out.print("N ");
        travel(x, y-1);
        System.out.print("NE ");
        travel(x-1, y-1);
    } else if (x > 0 && y == 0) {
        System.out.print("E ");
        travel(x-1, y);
    } else if (y > 0 && x == 0) {
        System.out.print("N ");
        travel(x, y-1);
    }
}

调用上述方法会产生以下代码:

  • 电话:旅行(2,1);
  • 输出:E E N // N E // NE // N E E // NE E

我知道,对于这个例子来说,问题在于E只需要为需要E的三种不同情况打印一次,因为在调用后续递归方法之前打印了E。

我想通过在每次调用travel方法时附加System.out.print命令来解决这个问题(不确定这是正确的方法)。这样,无论何时调用travel方法,结果都会每次都以第一个字母打印。但是,由于该方法不返回任何内容,我无法在print语句中插入该方法。这是我被困了很长时间的地方。

任何有关如何离开这里的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

在递归构建解决方案时,将部分构建的解决方案作为参数传递给递归调用是很常见的。

public void travel(int x, int y, String path) {
    if (x == 0 && y == 0) {
        System.out.println(path);
    } else if (x > 0 && y > 0) {
        travel(x-1, y, path + ' E');
        travel(x, y-1, path + ' N');
        travel(x-1, y-1, path + ' NE');
    } else if (x > 0 && y == 0) {
        travel(x-1, y, path + ' E');
    } else if (y > 0 && x == 0) {
        travel(x, y-1, path + ' N');
    }
}

了解我们如何构建路径 - 让函数调用处理复杂记忆我们在搜索中的位置?这也简化了我们的代码,因为我们每条路径只能调用一次System.out.println