簡體   English   中英

為什么我的遞歸循環兩次打印相同的值? - 爪哇

[英]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==2y==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 語句所做的是再次將xy的值添加到path ,當需要做的只是return path; .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM