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

不用.slice()实现递归数组乘积函数的问题求助

递归实现数组元素乘积问题与内置方法使用疑问解答

一、自定义slice函数的错误修正

你写的自定义arrSliced函数有几个关键问题导致代码失效:

  1. 函数内部没有返回生成的slicedArray,调用后会得到undefined,和数组元素相乘直接变成NaN
  2. 给end赋值时误用了全等运算符===,应该用赋值运算符=
  3. 调用arrSliced时参数传错,第一个参数应该是当前数组arr,而非productOfArray函数,且可给end设置默认值简化逻辑

修正后的代码如下:

function productOfArray(arr) {
  function arrSliced(arr, begin, end = arr.length) {
    let slicedArray = [];
    // 处理end超出数组长度的情况
    end = end > arr.length ? arr.length : end;
    // 可选:处理begin为负数的场景
    begin = begin < 0 ? arr.length + begin : begin;
    for (let i = begin; i < end; i++) {
      slicedArray.push(arr[i]);
    }
    return slicedArray; // 必须返回新数组
  }

  if (arr.length === 0) {
    return 1;
  }
  // 调用自定义slice,从索引1开始截取到末尾
  return arr[0] * productOfArray(arrSliced(arr, 1));
}

console.log(productOfArray([1, 2, 3])) // 6
console.log(productOfArray([1, 2, 3, 10])) // 60

二、解构赋值版本的错误修正

你的解构赋值逻辑本身是正确的,但调用函数时传参错误:函数接收的是数组,你却直接传入了三个独立参数3, 2, 5,应该传入数组[3, 2, 5]。修正后代码如下:

function productOfArray(arr) {
  if (arr.length === 0) {
    return 1;
  }

  const [head, ...tail] = arr;
  return head * productOfArray(tail);
}

let test = productOfArray([3, 2, 5]); // 传入数组
console.log(test); // 输出30

三、面试备考时使用内置方法的看法

  1. 以面试官要求为核心:如果面试官明确禁止使用内置函数(如slice、map等),必须手动实现对应逻辑,这考察的是你对底层原理的理解;若无明确限制,合理使用内置方法能让代码更简洁可读,完全没问题。
  2. 底层实现必须掌握:哪怕平时常用内置方法,也要清楚它的底层逻辑(比如slice如何创建新数组),面试中很可能要求你手动实现这类方法,这是高频考察点。
  3. 更优的无内置函数递归写法:可以不用创建新数组(不管slice还是自定义slice都会生成新数组),用索引递归的方式更节省内存,且完全不依赖内置函数:
function productOfArray(arr, index = 0) {
  // 终止条件:索引超出数组长度,返回1
  if (index >= arr.length) {
    return 1;
  }
  // 当前元素乘以后面所有元素的乘积
  return arr[index] * productOfArray(arr, index + 1);
}

console.log(productOfArray([1, 2, 3])) // 6
  1. 思路比写法重要:面试时重点是你能清晰讲出递归的终止条件、递归步骤,以及对问题的拆解逻辑,不管用不用内置方法,只要思路清晰,就是加分项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:40:50