带有递归的Java堆栈溢出错误
我有这样一段代码,它不断地给我堆栈溢出错误,我不知道如何修复它(我是递归新手)。我的代码有什么问题吗?带有递归的Java堆栈溢出错误,java,Java,我有这样一段代码,它不断地给我堆栈溢出错误,我不知道如何修复它(我是递归新手)。我的代码有什么问题吗? process(a, sum, row++, column); 由于使用了post increment,因此无条件地使用完全相同的参数调用函数(为了发现这一点,请向@fge发送提示)。这会立即导致无限递归 一旦您解决了这个问题,您将遇到另一个问题:您正在检查行是否等于a.length-1,并且您的代码可以使其超过a.length-1 process(a, su
process(a, sum, row++, column);
由于使用了post increment,因此无条件地使用完全相同的参数调用函数(为了发现这一点,请向@fge发送提示)。这会立即导致无限递归
一旦您解决了这个问题,您将遇到另一个问题:您正在检查行
是否等于a.length-1
,并且您的代码可以使其超过a.length-1
process(a, sum, row++, column); // increment #1
process(a, sum, row++, column--); // increment #2
由于使用了post increment,因此无条件地使用完全相同的参数调用函数(为了发现这一点,请向@fge发送提示)。这会立即导致无限递归
一旦您解决了这个问题,您将遇到另一个问题:您正在检查行
是否等于a.length-1
,并且您的代码可以使其超过a.length-1
process(a, sum, row++, column); // increment #1
process(a, sum, row++, column--); // increment #2
这似乎是错误的:
process(a, sum, row++, column);
process(a, sum, row++, column--);
请注意,递增后运算符和递减后运算符递增或递减变量,然后返回变量的旧值。因此,在这两行的第一行中,您使用与原始调用完全相同的值调用方法process
。然后将使用相同的值再次调用该方法,等等,直到调用堆栈溢出。这看起来是错误的:
process(a, sum, row++, column);
process(a, sum, row++, column--);
请注意,递增后运算符和递减后运算符递增或递减变量,然后返回变量的旧值。因此,在这两行的第一行中,您使用与原始调用完全相同的值调用方法process
。然后将使用相同的值再次调用该方法,等等,直到调用堆栈溢出。此行处理(a,sum,row++,column)
调用进程(a、sum、row、column)
和然后
增加行数
具有相同参数的相同函数会被反复调用,因此会溢出堆栈
这应该可以做到:process(a,sum,++行,列)代码>它首先递增它,然后作为参数传递。但是,您的行将递增。如果您不想这样做,只需使用:process(a,sum,row+1,column)代码>,它用递增的行调用process函数,同时不会更改调用它的方法中的行。此行进程(a,sum,row++,column)
调用进程(a、sum、row、column)
和然后
增加行数
具有相同参数的相同函数会被反复调用,因此会溢出堆栈
这应该可以做到:process(a,sum,++行,列)代码>它首先递增它,然后作为参数传递。但是,您的行将递增。如果您不想这样做,只需使用:process(a,sum,row+1,column)代码>,它使用递增的行调用进程函数,同时不会更改调用它的方法中的行。您调用:
process(a, sum, row++, column);
但是您使用后缀++
操作符;因此,如果行
不完全等于a.length-1
,则作为此函数参数的行
值在调用-->无限递归时不会更改
process(a, sum, row++, column); // increment #1
process(a, sum, row++, column--); // increment #2
电话:
另外,在下面的一行中检查您是否真的想打电话:
process(a, sum, row + 2, column);
而不是:
process(a, sum, row + 2, column - 1);
甚至:
process(a, sum, row + 1, column - 1);
鉴于您对后缀递增/递减运算符的使用混乱,很难说出您的意思
提示:为了避免将来出现此类错误,请将方法参数设置为,行
和列
,最终
;您将无法在方法的主体中修改它们…您调用:
process(a, sum, row++, column);
但是您使用后缀++
操作符;因此,如果行
不完全等于a.length-1
,则作为此函数参数的行
值在调用-->无限递归时不会更改
process(a, sum, row++, column); // increment #1
process(a, sum, row++, column--); // increment #2
电话:
另外,在下面的一行中检查您是否真的想打电话:
process(a, sum, row + 2, column);
而不是:
process(a, sum, row + 2, column - 1);
甚至:
process(a, sum, row + 1, column - 1);
鉴于您对后缀递增/递减运算符的使用混乱,很难说出您的意思
提示:为了避免将来出现此类错误,请将方法参数设置为,行
和列
,最终
;您将无法在方法体中修改它们…学习如何调试的绝佳时机。这里的alist
是什么?为什么要调用进程两次?不要递增行
或递减列
;只要在适当的地方使用row+1
和column-1
。正如我在回答中所说的,在方法声明中尝试将row
和column
声明为final
。。。然后看看在这种情况下你将如何编写你的方法……这是学习如何调试的绝佳时机。这里的alist
是什么?为什么要调用进程两次?不要递增行或递减列;只要在适当的地方使用row+1
和column-1
。正如我在回答中所说的,在方法声明中尝试将row
和column
声明为final
。。。那么看看在这种情况下你将如何编写你的方法…@fge:很好,谢谢!我已经更新了答案,使其包含此内容。它使用相同的参数调用,将导致堆栈溢出。如果问题是双增量,那么将出现数组索引异常。@TedHopp:它仍然是一个bug,当另一个bug修复时,它将显示出来。OP几乎肯定希望在对process
的两次调用中(以及第二次调用中的column-1
中)使用与row+1
相当的值。但是请注意,process
从来不会用第二个增量值调用,因此行
在任何调用中都不能真正超过a.length-1
。@fge: