[英]Error array index out of bounds in some code
我的递归函数中有一个数组索引超出范围异常。 有人可以向我指出为什么会这样吗? 这行:return minChange(a,IntegerList); 数组索引超出范围异常,也很可能出现以下情况:
返回minimumValue(1 + minChange(a-d,integerList),minChange(a,updatedList));
/* Function minChange: Minimum Change
Pseudo-code:
minChange(0, ds) = 0
minChange(a, []) = Failure
minChange(a, d :: ds) = minChange(a,ds) if d > a
minChange(a, d :: ds) = min(1 ++ minChange(a - d, d :: ds) otherwise
*/
public int minChange(int a, List<Integer> integerList) {
//int minimumResult = 0;
int indexNumber = 0;
int d = integerList.get(indexNumber); (line 246)
if(a == 0) {
// If a is 0 return 0
return 0;
} else if(integerList.isEmpty()) {
return -1;
} else if(d > a) {
integerList.remove(indexNumber); // Remove first element from list
// Recursive call to minChange
return minChange(a, integerList); (line 261)
} else {
// Create updatedList and remove first element
List<Integer> updatedList = integerList;
updatedList.remove(indexNumber);
indexNumber++;
return minimumValue(1 + minChange(a - d, integerList), minChange(a, updatedList)); (line 269)
}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out-of-bounds for length 0
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:246)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:269)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:269)
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:269)
如何解决此数组索引超出范围的异常。 似乎需要固定一行。 如果是这样,我该如何解决该错误? 有什么办法?
为什么失败:
导致越界异常的特定事件序列如下:
minChange(1, [4]) // goes into second-to-last (else if) case, since 4 > 1. 4 is then removed.
minChange(1, []) // crashes
目前尚不清楚您的代码在这种情况下打算做什么,因为您的伪代码未定义minChange(a, ds)
。
即使我们规定输入列表必须包含多个项目,我们也会经常遇到这种情况:
minChange(5,[4, 8])
minChange(1,[8])
minChange(1,[])
我不确定您打算在这里发生什么,但是无论如何,还有其他问题...
错误:
这行代码很可能有一个错误:
// this just creates another reference to the existing list
// https://stackoverflow.com/questions/6536094/java-arraylist-copy
// meaning: both recursive calls will operate on the same list
// even though one uses the "updatedList" reference and one uses "integerList"
List<Integer> updatedList = integerList;
另外,使用indexNumber
表示一个错误,因为只有在其值为0时才使用-递增是毫无意义的。 请记住,除非您将它们作为参数传递,否则函数中的局部变量在每次递归调用中都会被“重置”。
调试策略:
首先,阐明您实际上希望算法执行的操作。
然后,检查它的实际作用。 作为一种调试技术,我建议在函数调用开始时添加一些print语句:
System.out.println("minChange(" + a + ", " + integerList + ")");
...以便您可以查看崩溃之前发生的情况的日志。 您也可以为此使用调试器。
最后,一旦在一些简单的情况下可以使用,编写一个模糊测试器,在一堆随机列表和不同大小a
s上检查您的算法,以查看是否遗漏了任何情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.