我的老师让我们做了这些错误修复作业,而我无法解决这个问题。这就是我来到这里的原因。我想问一个问题和一些问题
问题:错误信息的含义是什么(我只是想知道自己的好奇心),为什么它会使用我的代码专门发生,我该如何解决?
支持:请你修改我的代码,抱歉,如果这似乎是一种获得答案的方法,但我有点迷失。
这是代码
public class Recursion
{
public static void indifferent( int x, int y )
{
System.out.print( x );
indifferent( x - 1, y + 2 );
System.out.print( y );
}
}
public class RecursionDriver//-the driver class
{
public static void main( String [] args )
{
Recursion.indifferent( 7, -1 );
}
}
答案 0 :(得分:3)
如果您检查代码,那么它应该是永远无法终止的。每次拨打indifferent
都会再次拨打indifferent
。无条件。
发生StackOverflowError
因为嵌套调用太深了。 Java方法调用使用堆栈来保存局部变量(以及返回地址和其他内容)。堆栈具有固定大小。如果嵌套调用太多,则堆栈溢出。
如何解决?重写代码以执行当前正在执行的操作,但不使用使用递归。
但首先你需要了解它在做什么。你是怎样做的?嗯......基本上......你读了代码。
嗯,我不能完全确定什么是无关紧要的,因为这是我老师告诉我们把它作为班级的名字(她说它毫无意义,并告诉我们忽略它)
烨。忽略名称,并阅读代码实际执行的操作。如果你无法弄明白......那么"手执行"它用铅笔和纸。
答案 1 :(得分:0)
在递归中,您尝试在子问题中划分问题并尝试计算结果。因此,在递归中,您总是需要有一个基本案例。在递归的最后深度中的基本情况。一旦你到达基本案例,你就开始走出递归并获得最终答案。
在您的代码中:
public static void indifferent( int x, int y )
{
System.out.print( x );
indifferent( x - 1, y + 2 );
System.out.print( y );
}
你没有基本情况,你的代码只是继续深入递归。
public static void indifferent( int x, int y )
{
if(x == 1) //example of a base case
return;
System.out.print( x );
indifferent( x - 1, y + 2 );
System.out.print( y );
}