java - 嵌套递归错误

标签 java recursion nested

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.StackOverflowError 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 行是克隆调用/增量。因此,据我所知,我的 PrintAsteriskLine 函数存在问题,但该函数在单独调用时工作正常。

最佳答案

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

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

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

你想做这样的事情:

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

关于java - 嵌套递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32671836/

相关文章:

java - 我想在应用程序运行时请求权限 android Marshmallow ..!

java - 与 AS400 的 JDBC 连接创建 Nullpointer

java - 如何使用 java Process 知道文件是否已关闭

xml - 使用 Go 解码嵌套的 xml

java - 我们可以在List中插入多种类型的元素吗?

recursion - 函数的递归迭代导致堆栈溢出

sql - 使用CTE的相邻列表和递归查询,如何回填?

iphone - 如何将 View 从容器 View 内部移动到另一个容器 View 内部?

c# - 在每个索引处对嵌套列表中的值求和

list - 空列表上的 foldMap 时 Haskell 模棱两可的类型变量编译器错误