groupNoAdj函数异常:打印为9的元素==比较不相等且返回错误
问题分析与修复:groupNoAdj函数逻辑错误
问题背景
这段Java代码原本用于判断:从int数组中选取不相邻的元素(即每隔一个元素),其和是否等于目标值。但实际运行中仅在数组长度为1时工作正常,其他场景存在逻辑错误。
原代码
import java.util.Arrays; public static boolean groupNoAdj(int start, int[] nums, int target) { if (nums.length<=2){ System.out.println(nums[0]+""+target); return (nums[0]==target); } int hey = nums[start]; int[] bleb = Arrays.copyOfRange(nums, start+2, nums.length); bleb[0] += hey; groupNoAdj(0, bleb, target); return false; // doesn't ever run }
测试异常情况
- 调用
groupNoAdj(0, new int[]{9}, 9)返回true,符合预期; - 调用
groupNoAdj(0, new int[]{3, 3294582, 6}, 9)返回false,不符合预期(3+6=9,应返回true)。
调试发现:在第3行添加打印语句后输出99(此时nums[0]为9,target为9),即便将判断条件硬写为9==9,函数仍返回false。
错误原因
- 递归结果被忽略:当数组长度大于2时,执行递归调用后直接返回
false,完全丢弃了递归的返回值,导致正确的递归结果无法向上传递。 - 数组处理逻辑错误:
bleb[0] += hey的操作直接修改新数组元素,这不是“选取不相邻元素求和”的正确递归思路,会破坏原数组的元素独立性。 - 边界条件不完善:当数组长度<=2时,仅判断第一个元素是否等于目标值,忽略了可以选择第二个元素的情况(比如数组
[5,9],目标值9应返回true)。
修复后的代码
import java.util.Arrays; public static boolean groupNoAdj(int start, int[] nums, int target) { // 递归终止:遍历完数组,检查剩余目标值是否为0 if (start >= nums.length) { return target == 0; } // 分支1:选择当前元素,跳过下一个,目标值减去当前元素 if (groupNoAdj(start + 2, nums, target - nums[start])) { return true; } // 分支2:不选当前元素,直接递归下一个,目标值不变 return groupNoAdj(start + 1, nums, target); }
修复逻辑说明
- 终止条件:当
start超出数组范围时,判断剩余目标值是否为0,若为0说明找到了符合条件的元素组合。 - 递归分支:
- 选择当前元素:下一次递归从
start+2开始(跳过相邻元素),目标值减去当前元素的值; - 不选择当前元素:下一次递归从
start+1开始,目标值保持不变。
- 选择当前元素:下一次递归从
- 结果传递:只要任意一个分支返回
true,整个函数就返回true,确保正确结果能向上传递。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

