【发布时间】:2017-01-18 05:44:43
【问题描述】:
我知道通过迭代而不是递归更容易找到数组中数字的总和,但是如果我要使用递归来编写这样的函数,那么这段代码会有什么问题?
public static double sum (double[] a) {
if (a.length == 0)
return 0.0;
else{
return sumHelper (a, 1, a[0]);
}
}
private static double sumHelper (double[] a, int i, double result) {
if (i < a.length) {
result = result + sumHelper (a, i + 1, result);
}
return result;
}
一切运行都没有错误,但在我测试时没有返回正确的总和。
【问题讨论】:
-
在每次递归调用中将问题减少一个将导致堆栈大小为 O(n)。如果有任何机会你必须处理大型数组,你最好写
sumHelper来返回一个范围内的总和。如果范围的长度为 1,则返回该元素的值。否则将范围分成两半,在每一半上递归调用sumHelper,并返回结果的总和。这并没有减少工作量,但会给堆栈带来 O(log n) 的增长,并允许您处理更大的数组。