Java递归打印来自一个方法调用的星号

时间:2013-04-23 00:12:29

标签: java recursion

我有一个在Java中引入Recursion的作业,我遇到了障碍。赋值需要递归方法,以根据传递给它的整数值输出多个星号的行数。例如,如果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
    }

从主要调用它:

    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));

我已经尝试了他的版本并且在它的侧面打印了三角形,但是最大的行只打印一次而不是两次。我花了一整天时间试图改变他在中间添加一个重复的行,我开始认为这是不可能的。

任何帮助都会非常感激。我对此完全停顿了。

3 个答案:

答案 0 :(得分:0)

将方法签名更改为public static void myMethod(int n, boolean reversed),其中reversed初始化为false,但在打印n星号时翻转为true。在方法内部,如果reversed为真,则反转您的逻辑。

答案 1 :(得分:0)

您基本上只需打印出当前行,然后执行递归调用,然后再次打印该行。这样,你就可以在上升的过程中获得堆栈,然后再向下移动。

这是一个使用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();
}

答案 2 :(得分:0)

由于输出计数 up (不是*降至零),您必须传入星号数以打印最大数量,因此终止条件可以成立。

此外,您的方法的伪代码是:

  • 如果n>最大回报(终止条件)
  • print n asterisks
  • 以n + 1
  • 递归调用
  • print n asterisks

如果你传入的不是当前的打印长度,而是星号的字符串,那么可以实现大量的代码简化,所以你的(私有)递归方法可以简单:

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

恕我直言,这是一个优秀的实现,具有良好的代码密度。