You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

错误原因

  1. 递归结果被忽略:当数组长度大于2时,执行递归调用后直接返回false,完全丢弃了递归的返回值,导致正确的递归结果无法向上传递。
  2. 数组处理逻辑错误:bleb[0] += hey的操作直接修改新数组元素,这不是“选取不相邻元素求和”的正确递归思路,会破坏原数组的元素独立性。
  3. 边界条件不完善:当数组长度<=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:05:29