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/