我正在解决练习问题而且陷入困境。该问题要求编写一个方法,该方法采用两个整数x和y来打印所有在2D平面中从(0,0)到(x,y)行进的解决方案,重复使用三个移动中的一个:
以下是一些示例调用:
我写了以下代码:
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);
}
}
调用上述方法会产生以下代码:
我知道,对于这个例子来说,问题在于E只需要为需要E的三种不同情况打印一次,因为在调用后续递归方法之前打印了E。
我想通过在每次调用travel方法时附加System.out.print命令来解决这个问题(不确定这是正确的方法)。这样,无论何时调用travel方法,结果都会每次都以第一个字母打印。但是,由于该方法不返回任何内容,我无法在print语句中插入该方法。这是我被困了很长时间的地方。
任何有关如何离开这里的建议都将受到赞赏。
答案 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
。