递归计数数组中的元素-大数组

时间:2019-02-22 22:52:41

标签: java

我正在学习递归,我应该创建一个递归方法来计算数组中特定数字的出现次数,例如: {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;
   }

1 个答案:

答案 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参数),或仅限制输入数组的大小。