JavaScript函数执行返回NaN结果的代码错误排查
函数返回NaN的原因
你这段实现打家劫舍算法的JS函数运行返回NaN,核心触发点是数组越界访问,具体问题如下:
- 循环终止条件是
i < nums.length,当i遍历到数组末尾位置时,你代码里访问的nums[i+1]、nums[i+2]已经超出数组的有效索引范围。JS中访问数组不存在的索引不会抛出异常,只会返回undefined,当数字类型和undefined执行加法运算时,结果就会是NaN,一旦累加过程中出现NaN,后续所有累加结果都会是NaN。 - 以你传入的测试用例
[1,2,3,1]为例,数组合法索引是0-3:- 当
i=2时,i+2=4,nums[4]为undefined,此时a += 3 + undefined已经得到NaN - 当
i=3时,i+1=4、i+2=5,两个位置都是undefined,会进一步让b也变成NaN
- 当
- 除了越界问题,你当前的累加逻辑本身也不符合打家劫舍的动态规划规则:每轮循环重复累加相邻位置的数值,就算修复越界问题,也会因为重复计算得到错误结果,无法算出不相邻盗窃的最大金额。
修正后的参考实现
var rob = function(nums) { if (nums.length === 0) return 0; if (nums.length === 1) return nums[0]; // 滚动变量存储前前位、前一位的最大可盗窃金额 let a = 0, b = 0; for (let i = 0; i < nums.length; i++) { // 偷当前位就不能偷前一位,取前前位最大值+当前金额;不偷当前位就取前一位最大值 const temp = Math.max(b, a + nums[i]); a = b; b = temp; } return b; }; console.log(rob([1,2,3,1])); // 输出正确结果4
内容的提问来源于stack exchange,提问作者srig
相关产品推荐
相关产品推荐

