簡體   English   中英

Java遞歸從一個方法調用中打印星號

[英]Java Recursion printing asterisks from one method call

我有一項介紹 Java 中遞歸的作業,但遇到了障礙。 賦值需要一種遞歸方法,根據傳遞給它的整數值輸出多行星號。 例如,如果 4 作為變量 n 傳入,則輸出將有一個星號的第一行,下一行 2 個星號,接下來的 3 個星號,接下來的 4,然后是 4、3、2 和 1。

我已經能夠完成輸出的前半部分(雖然不確定它是否是最佳的),但不知道如何讓方法倒退。 這一切都將在一個方法調用中完成,並將變量 (n) 傳遞給該方法。

這是我到目前為止的方法:

    public static void myMethod(int n)
    {       
    if (n <= 1) {
            System.out.print("*");          
    } else {
        myMethod(n - 1);
        for (int i = 0; i < n; i++) {
            System.out.print("*");
        }
    }

    System.out.print("\n"); // new line
    }

它是從 main 調用的:

    myMethod(n);

所以我有一個 for 循環,它將在同一行“n”次打印一個星號。 在 for 循環之后,它繼續下一行並循環,改變 n。 但我不知道如何讓它逆轉。

我的方法從方法打印出來。 我的講師向我展示了一個傳遞 2 個變量 (n) 和一個空字符串的示例版本。

    public static String myMethod(int n, String displayStr) {       
        String currentStr = "";

    for (int i = 0; i < n; i++)
        currentStr += "*";
        currentStr += "\n";

        if (displayStr == null){
            return myMethod((n - 1), currentStr);   
        } // end base case

        else if (n > 0){
            return myMethod((n - 1), (currentStr + displayStr + currentStr));
        }

        else {
            return displayStr;
        }
    } // end recursion method myMethod

他的版本使用以下代碼行從 main 打印:

    System.out.println(myMethod(n, null));

我試過他的版本,它在它的側面打印三角形,但最大的線只打印一次而不是兩次。 我花了一整天的時間試圖改變他在中間添加一條重復的行,我開始認為這是不可能的。

任何幫助將不勝感激。 我對此完全停滯不前。

將方法簽名更改為public static void myMethod(int n, boolean reversed) ,其中reversed初始化為 false,但在打印n星號時翻轉為 true。 在方法內部,如果reversed為真,則反轉您的邏輯。

您基本上只需要打印出當前行,然后進行遞歸調用,然后再次打印該行。 這樣,你會在向上的過程中積累堆棧,然后在向下的過程中再次積累。

這是一個使用 2 個參數的示例,一個是最大長度,另一個是遞歸的迭代器。

// bootstrap method to start the recursion
public static void myMethod(int length)
{
    myMethod(length, length);
}

public static void myMethod(int length, int i)
{
    if (i > 0)
    {
        int rowLength = length - i + 1;

        printRow(rowLength, '*');

        myMethod(length, i - 1);

        printRow(rowLength, '*');
    }
}

public static void printRow(int length, char symbol)
{
    for (int i = 0; i < length; i++)
        System.out.print(symbol);
    System.out.println();
}

因為輸出是向上計數(而不是*向下計數到零),所以必須傳入要打印的星號數量最大數量,這樣才能建立終止條件。

此外,您的方法的偽代碼是:

  • 如果 n > 最大回報(終止條件)
  • 打印 n 個星號
  • 用 n + 1 遞歸調用
  • 打印 n 個星號

如果您傳入的不是要打印的當前長度,而是星號字符串,則可以實現大量代碼簡化,因此您的(私有)遞歸方法可以很簡單:

private static void myMethod(int n, String s) {
    if (s.length() < n) return;
    System.out.println(s);
    myMethod(n, s + "*");
    System.out.println(s);
}

然后您設置初始條件的公共方法是:

public static void myMethod(int n) {
    myMethod(n, "*");
}

恕我直言,一個優雅的實現,具有良好的代碼密度。

暫無
暫無

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

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