我正在学习递归,我应该创建一个递归方法来计算数组中特定数字的出现次数,例如: {4,4的{1,2,3,4,4,5}应该返回2。我知道递归不是解决此问题的理想问题,我也知道使用endIndex也不理想,但这只是教科书问题我似乎无法解决。
我的方法效果不佳,因为在大型数组中运行时,我总是会耗尽堆内存。我将如何优化此类代码?谢谢!
public static int countNumber(int[] array, int startIndex, int endIndex, int
number) {
int result = 0;
if (startIndex==endIndex) {
return result;
}
if (array[startIndex] == number ) {
result++;
}
result = result + countNumber(array,startIndex+1,endIndex,number);
return result;
}
答案 0 :(得分:5)
确定要用完堆而不是用完 stack 吗?因为在这里要在大型阵列上用完堆栈是很值得的。递归的深度始终受堆栈大小的限制。
您可以在每次迭代中将数组分为两个部分,然后在两个部分上递归运行该方法。这样,对于输入数组的n个元素,递归深度将为log2(n)而不是n。遵循以下内容:
if (startIndex == endIndex) {
if (array[startIndex] == number) {
return 1;
}
return 0;
}
return countNumber(array, startIndex, (startIndex + endIndex) / 2, number)
+ countNumber(array, (startIndex + endIndex) / 2 + 1, endIndex, number);
当然,您也可以增加堆栈大小(例如,使用-Xss10m参数),或仅限制输入数组的大小。