[英]Why is my recursive loop printing the same value twice? - JAVA
下面的代码递归地将 x 减少 1,直到它等于 y。 它打印一个表示递归过程的字符串。 我不希望 x 的起始值打印在字符串中。
private static String createPath(int x, int y, String path) {
if (x > y) {
path += "(" + (x-1) + "," + y + ") ";
return createPath(x - 1, y, path);
}
else
return path += "(" + x + "," + y + ") ";
}
当我输入以下内容时:
System.out.println(createPath(5, 1, ""));
我得到以下输出:
(4,1) (3,1) (2,1) (1,1) (1,1)
为什么最终值 (1,1) 被打印两次? 我注意到当我从
path += "(" + (x-1) + "," + y + ") ";
输出变为:
(5,1) (4,1) (3,1) (2,1) (1,1)
但是再一次,我不希望 (5,1) 打印在字符串中。 另外,我已经看过为什么我的递归循环在最后两次打印最后一个值? 但它似乎没有帮助我。
仅仅因为当x==2
和y==1
条件x>y
为真并且"(" + (x-1) + "," + y + ") "
返回 (1,1)
您的定义应如下所示:
private static String createPath(int x, int y, String path) {
if (x <= y) {
return path;
}
path += "(" + (x - 1) + "," + y + ") ";
return createPath(x - 1, y, path);
}
此定义将确保只要x <= y
,就会返回path
的值。
正确的解决方法:
private static String createPath(int x, int y, String path) {
if (x > (y + 1))
return createPath(x - 1, y, path + "(" + (x - 1) + "," + y + ") ");
else
return path + "(" + (x - 1) + "," + y + ") ";
}
注意, if (x > (y + 1))
和(x - 1)
在 else 分支中。
您的函数的执行顺序如下:
createPath(5, 1) => createPath(4, 1, "(4,1)");
createPath(4, 1) => createPath(3, 1, "(3,1)");
createPath(3, 1) => createPath(2, 1, "(2,1)");
createPath(2, 1) => createPath(1, 1, "(1,1)");
// and the last one in the else branch
createPath(1, 1) => createPath(1, 1, "(1,1)");
如您所见,您需要在 else 分支中添加 (x - 1) 并修改您的 if 语句,以便您更早到达 else 分支以防止它低于 1。
原来最终值被打印两次的原因是因为else
返回语句不必要地添加了 (x,y) 的最终值。 例如,
else
return path += "(" + x + "," + y + ") ";
一旦x
不再大于y
,就会执行上述代码,这意味着通过createPath(int x, int y, String path)
传递的 path 值包含彼此相等的 (x,y) 。 然而,上面的 else 语句所做的是再次将x
和y
的值添加到path
,当需要做的只是return path;
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.