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

LeetCode 494暴力递归方案result作为类属性可运行作为参数传递失败原因

问题原因分析
  • 核心根因:该问题由Java仅支持值传递的参数机制和基本数据类型的特性共同导致。
  • 第一种实现正常的原因:
    代码中result是类的实例成员变量,所有递归调用的helper方法共享该实例的同一个result属性。每次匹配到目标和时的自增操作都是直接修改该共享变量,改动全局生效,最终返回的是累计后的正确计数。
  • 第二种实现无法得到正确结果的原因:
    int属于Java基本数据类型,当你把result作为入参传入helper方法时,传递的是原值的副本,每个递归栈帧里的result都是独立的局部变量。你在helper中执行的result++仅修改当前栈帧的局部副本,既不会影响findTargetSumWays中定义的原始result变量,也不会同步到其他递归调用的result副本,所有计数操作都没有落到最终要返回的变量上,最终返回值永远是初始值0。
  • 如果要使用传参的方式实现,可以选择两种修改方案:
    1. 把result改为长度为1的int数组:数组属于引用类型,参数传递时传递的是引用的副本,所有调用都指向堆中同一个数组对象,修改数组内的元素会全局生效:
    class Solution {
        public int findTargetSumWays(int[] nums, int S) {
            int[] result = new int[1];
            if (nums == null || nums.length == 0) return result[0];
            helper(nums, S, 0, 0, result);
            return result[0];
        }
        
        public void helper(int[] nums, int target, int pos, long eval, int[] result){
            if (pos == nums.length) {
                if (target == eval) result[0]++;
                return;
            }
            helper(nums, target, pos + 1, eval + nums[pos], result);
            helper(nums, target, pos + 1, eval - nums[pos], result);
        }
    }
    
    1. 让helper方法返回当前递归分支的符合条件的数量,递归逐层累加:
    class Solution {
        public int findTargetSumWays(int[] nums, int S) {
            if (nums == null || nums.length == 0) return 0;
            return helper(nums, S, 0, 0);
        }
        
        public int helper(int[] nums, int target, int pos, long eval){
            if (pos == nums.length) {
                return target == eval ? 1 : 0;
            }
            return helper(nums, target, pos + 1, eval + nums[pos]) 
                 + helper(nums, target, pos + 1, eval - nums[pos]);
        }
    }
    

内容的提问来源于stack exchange,提问作者alpha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:45:07