繁体   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