我试图使用递归来计算某个元素的出现次数,但是我不断得到一个超出边界的数组错误。
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);
}
}
答案 0 :(得分:0)
检查方法顶部的长度。当长度为0时,您无法访问[0]。
每次都可以在方法中传递一个索引并从该索引开始下一个递归,而不是创建数组。
答案 1 :(得分:0)
替换occur(number, a);
同
Arrays.stream(a).filter(n -> a == n).count();
答案 2 :(得分:0)
很少有事情。
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
无用的count += 0
替换递归以添加此迭代中的计数你可以简单地将它简化为
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);
}