嵌套递归错误
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
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