Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java递归从一个方法调用打印星号_Java_Recursion - Fatal编程技术网

Java递归从一个方法调用打印星号

Java递归从一个方法调用打印星号,java,recursion,Java,Recursion,我有一个任务是在Java中引入递归,我遇到了一个障碍。赋值需要递归方法,根据传递给它的整数值,输出多行星号。例如,如果4作为变量n传入,则输出的第一行将有一个星号,下一行有2个星号,下一行有3个星号,下一行有4个,然后是4、3、2和1 我已经能够完成输出的前半部分(虽然不确定它是否是最优的),但不知道如何让方法反向返回。这一切都要在一个方法调用中完成,并将一个变量(n)传递给该方法 以下是我到目前为止采用的方法: public static void myMethod(int n)

我有一个任务是在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
    }
所以我有一个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
我试过他的版本,它在边上打印三角形,但最大的一条线只打印一次,而不是两次。我花了一整天的时间试图改变他的位置,在中间添加了一条重复的线,我开始认为这是不可能的。
任何帮助都将不胜感激。我对此完全无法动弹。

将方法签名更改为
公共静态无效myMethod(int n,布尔反转)
其中
反转的
初始化为false,但在打印
n
星号时翻转为true。在方法内部,如果
reversed
为true,则反转逻辑。

基本上只需打印出当前行,然后执行递归调用,然后再次打印该行。这样,你可以在上升的过程中得到堆积物,然后在下降的过程中再次得到堆积物

下面是一个使用两个参数的示例,一个是最大长度,另一个是递归的迭代器

// 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();
}
//启动递归的引导方法
公共静态void myMethod(int-length)
{
myMethod(长度、长度);
}
公共静态void myMethod(int-length,int-i)
{
如果(i>0)
{
int rowLength=长度-i+1;
打印行(行长“*”);
myMethod(长度,i-1);
打印行(行长“*”);
}
}
公共静态void printRow(整数长度,字符符号)
{
for(int i=0;i
因为输出是向上计数(而不是向下计数到零),所以必须输入要打印的星号数和最大数字,以便确定终止条件

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

  • 如果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);
}

IMHO是一个优雅的实现,具有良好的代码密度。

如果您想放置一个双n大小的行,您应该看看n是max(第一次调用)的情况——当
displayStr==null
时。好的,这实际上似乎是有意义的。我的教授喜欢从课本上的powerpoint幻灯片上教学,而我从实践中学习得更好。我也要试一试!非常感谢你!这非常有效,谢谢!我的教授要求我们只使用一种方法,但当我开始向他询问有关他的例子的问题时,他无法真正回答,因此我也不确定他是否对这个问题全神贯注。如果终止条件是任意的,你必须将atate传递到下一个电话。如果您想打印
431234
,您只需要一个方法,因为编译时已知终止条件为n=0。所以递归方法必须有两个参数;这是绕不开的。这种代码模式非常常见——私有代码传递它需要的任何额外参数,而公共API提供一个简单的API,设置初始状态并隐藏递归实现的复杂性。基本上,你的“教授”错了。
// 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();
}
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, "*");
}