计数元素

时间:2017-04-14 20:37:59

标签: java recursion

我试图使用递归来计算某个元素的出现次数,但是我不断得到一个超出边界的数组错误。

public static void main(String[] args) {
        int[] a ={70,70,86,53};
        int number = 70;
        int done = occur(number, a);
        System.out.println(done);
    }

    public static int occur(int number, int[] a, int count) {
        int length = a.length;
        int count = 0;
        if (a[0] != number) {
            count += 0;
        } else {
            if (a[0] == number) {
                count += 1;
            }
        }
        if (length == 0) {
            return count;
        }
        int[] a2 = Arrays.copyOfRange(a, 0, a.length - 1);
        return occur(number, a2, count);
    }

}

4 个答案:

答案 0 :(得分:0)

检查方法顶部的长度。当长度为0时,您无法访问[0]。

每次都可以在方法中传递一个索引并从该索引开始下一个递归,而不是创建数组。

答案 1 :(得分:0)

替换occur(number, a);Arrays.stream(a).filter(n -> a == n).count();

答案 2 :(得分:0)

很少有事情。

  1. 最好传递索引,然后每次都快速复制数组
  2. 检查开头的长度(或当前索引是长度)并返回0.
  3. 删除if from rest_framework.routers import DefaultRouter class NoPutRouter(DefaultRouter): """ Router class that disables the PUT method. """ def get_method_map(self, viewset, method_map): bound_methods = super().get_method_map(viewset, method_map) if 'put' in bound_methods.keys(): del bound_methods['put'] return bound_methods 无用的
  4. 使用count += 0替换递归以添加此迭代中的计数
  5. 你可以简单地将它简化为

    return count + occur(number, a2)

答案 3 :(得分:0)

您有两个逻辑错误。

1)你的递归方法需要3个参数:搜索的数字,搜索的实际数量和搜索的实际数组。
您没有为实际计数指定任何参数。因此,信息在下一次递归调用中丢失。

2)您比较数组的第一个元素,以检查其值是否与要搜索的数字匹配:

if (a[0] == number) {
  count += 1;
}

但是在下一个递归调用的sent参数中删除了数组的最后一个元素

int[] a2 = Arrays.copyOfRange(a, 0, a.length - 1);
return occur(number, a2);

会产生不准确的结果。

作为旁注:

  • 您有不需要的处理。 这样做有什么意义:

    if (a[0] != number) { count += 0; }

它不会增加计数器。所以,它没用了

  • 可以通过添加一个参数来避免数组副本,该参数在每次调用时传输要处理的当前索引。

以下是带有更正的示例代码:

public static void main(String[] args) {
    int[] a = { 70, 70, 86, 53 };
    int number = 70;
    int done = occur(number, 0, a, 0);
    System.out.println(done);
}

public static int occur(int number, int count, int[] a, int index) {

    if (index == a.length) {
        return count;
    }

    else if (a[index] == number) {
        count += 1;
    }

    return occur(number, count, a, ++index);
}