为什么我的递归循环要打印相同的值两次JAVA

为什么我的递归循环要打印相同的值两次JAVA,java,recursion,Java,Recursion,下面的代码递归地将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。它打印一个表示递归过程的字符串。 我不希望在字符串中打印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要打印两次?我注意到当我把x-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

仅仅是因为当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您的定义应如下所示:

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正确的解决方案:

    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 + ") ";
    }

注意,如果else分支中的x>y+1和x-1

函数的执行顺序如下所示:

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。

正确的解决方案:

    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 + ") ";
    }

注意,如果else分支中的x>y+1和x-1

函数的执行顺序如下所示:

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 return语句不必要地添加了x,y的最终值。比如说,

else 
      return path += "(" + x + "," + y + ") ";

一旦x不再大于y,则执行上述代码,这意味着通过createPathint x,int y,String path传递的路径值包含彼此相等的x,y。然而,上面的else语句所做的是再次将x和y的值添加到path中,此时只需返回path

结果表明,最终值被打印两次的原因是因为else return语句不必要地添加了最终值x,y。比如说,

else 
      return path += "(" + x + "," + y + ") ";

一旦x不再大于y,则执行上述代码,这意味着通过createPathint x,int y,String path传递的路径值包含彼此相等的x,y。然而,上面的else语句所做的是再次将x和y的值添加到path中,此时只需返回path

移除-1对我来说似乎是正确的解决方案。如果你不想打印5,1,为什么要用5作为初始x来调用createPath?@Siguza没有理由,它只是我选择的x的起始值。如果我为x选择了4,这对我的陈述没有任何影响,我不希望x的起始值被打印在字符串中,删除-1对我来说似乎是正确的解决方案。如果你不想打印5,1,为什么要用5作为初始x来调用createPath?@Siguza没有理由,它只是我选择的x的起始值。如果我选择了4作为x,这对我的陈述没有任何影响。我不希望x的起始值被打印在字符串中。谢谢你,先生,你帮助我理解了我的问题所在,但这不是你刚才解释的哈哈。而不是返回路径+=+x+,+y+;我所要做的就是返回路径;。谢谢你,先生,你帮助我理解了我的问题是什么,但这不是你刚才解释的哈哈。而不是返回路径+=+x+,+y+;我所要做的就是返回路径;。