Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有递归的Java堆栈溢出错误_Java - Fatal编程技术网

带有递归的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: