嵌套递归错误

Nested Recursion Error

public static void main(String[] args) {
    PrintAsteriskLine(5);
    System.out.println("Separate");
    PrintAsterisk(7);
}

public static void PrintAsterisk(int N)
{
    if (N==1)
        PrintAsteriskLine(N);
    else
        PrintAsteriskLine(N);
        PrintAsterisk(N-1);  
}// end PrintAsterisk

public static void PrintAsteriskLine(int N)
{
    if (N==1)
            System.out.println("*");
    else
    {
        System.out.print("*");
        PrintAsteriskLine(N-1);
    }
} // end PrintAsteriskLine

以上是我在Java中的代码。我在 NetBeans 上编码。我的想法是将 PrintAsteriskLine 函数嵌套在 PrintAsterisk 函数中以打印 N 行星号,从 N 开始并向 1 递增。例如,如果我输入 3 作为参数,则输出如下:

***
**
*

现在,我的代码确实做到了。但是,它也给了我一个我不明白的堆栈溢出错误。有人可以向我解释发生了什么吗?是因为我在嵌套递归函数吗?我真的很茫然。它有效但给我一条错误消息:/

Exception in thread "main" java.lang.WhosebugError at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691) at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129) at java.io.PrintStream.write(PrintStream.java:526) at java.io.PrintStream.print(PrintStream.java:669) at madisonbrewerrecursion.MadisonBrewerRecursion.PrintAsteriskLine(MadisonBrewerRecursion.java:38)

然后它说

at madisonbrewerrecursion.MadisonBrewerRecursion.PrintAsteriskLine(MadisonBrewerRecursion.java:39)

很多次。第 38 行是 PrintAsteriskLine 中的打印语句,第 39 行是 clone-call/incrementation。因此,据我所知,我的 PrintAsteriskLine 函数存在问题,但它在单独调用时工作正常。

这是你的缩进问题。看这里

public static void PrintAsterisk(int N)
{
    if (N==1)
        PrintAsteriskLine(N);
    else
        PrintAsteriskLine(N);
        PrintAsterisk(N-1);  
}// end PrintAsterisk

您在 else 之后缩进了这两件事,就好像您希望它们在 N != 1 时都发生一样。但是,由于您没有用大括号将它们括起来,因此只有 else 之后的第一行会在 N != 1 时执行。 PrintAsterisk(N-1) 在这两种情况下都将是 运行,因此递归永远不会终止。

您想做这样的事情:

public static void PrintAsterisk(int N)
{
    if (N==1) {
        PrintAsteriskLine(N);
    } else {
        PrintAsteriskLine(N);
        PrintAsterisk(N-1);  
    }
}// end PrintAsterisk

您的代码无法处理 N<1 时发生的情况,因此递归永远不会结束。试试这个。

public static void PrintAsterisk(int N)
    {
        if(N<1)
            return;
        if (N==1)
            System.out.println("*");
        else
            PrintAsteriskLine(N);
            PrintAsterisk(N-1);  
    }// end PrintAsterisk