Java无循环无导入实现元素计数及奇偶判断的递归方案求解
问题背景
需要实现功能:统计指定数字在整数数组中的出现次数,判断次数的奇偶性,要求不使用任何导入包、不使用循环,仅通过递归实现。
示例输入:(3, new int[]{3,3,4,5,3,3,2,1}),预期返回true(3出现4次,为偶数)
原有代码错误点
- 变量名不匹配:方法入参为
num、numarr,代码中错误使用了未定义的a、n变量 - 状态无法传递:索引
i、计数器counter定义在方法内部,每次递归都会被重置为0,无法继承上一层的计算结果 - 返回值类型错误:方法声明返回
int,实际逻辑需要返回boolean类型的奇偶判断结果 - 终止条件逻辑错误:错误将数组元素值和数组长度做对比,无法正确判断遍历结束的状态
正确实现方案
方案1:先递归计数再判断奇偶(符合原有思路)
不需要额外定义全局变量,通过递归参数传递当前遍历的下标,递归回溯时累加计数即可:
public class NumberCheck { public static boolean evenNumberOf(int target, int[] arr) { // 边界处理:空数组时目标数字出现次数为0,属于偶数 if (arr == null || arr.length == 0) { return true; } // 递归计算总出现次数,判断是否为偶数 return countTarget(target, arr, 0) % 2 == 0; } // 私有递归方法:返回从index下标开始到数组末尾,target的出现次数 private static int countTarget(int target, int[] arr, int index) { // 终止条件:下标超出数组范围,返回0 if (index == arr.length) { return 0; } // 当前元素匹配则加1,否则加0,再加上后续下标的计数结果 return (arr[index] == target ? 1 : 0) + countTarget(target, arr, index + 1); } // 测试入口 public static void main(String[] args) { // 示例输入测试 System.out.println(evenNumberOf(3, new int[]{3,3,4,5,3,3,2,1})); // 输出true } }
方案2:直接传递奇偶状态(更高效,无需累计全量计数)
因为只需要判断奇偶,不需要知道具体出现次数,每匹配到一次目标数字直接翻转奇偶状态即可:
public class NumberCheck { public static boolean evenNumberOf(int target, int[] arr) { if (arr == null || arr.length == 0) { return true; } return checkParity(target, arr, 0, true); } // 私有递归方法:isEven表示当前累计出现次数是否为偶数 private static boolean checkParity(int target, int[] arr, int index, boolean isEven) { if (index == arr.length) { return isEven; } // 匹配到目标数字,翻转奇偶状态 if (arr[index] == target) { isEven = !isEven; } return checkParity(target, arr, index + 1, isEven); } public static void main(String[] args) { System.out.println(evenNumberOf(3, new int[]{3,3,4,5,3,3,2,1})); // 输出true } }
内容的提问来源于stack exchange,提问作者KastratenKarl
相关产品推荐
相关产品推荐

