不用.slice()实现递归数组乘积函数的问题求助
递归实现数组元素乘积问题与内置方法使用疑问解答
一、自定义slice函数的错误修正
你写的自定义arrSliced函数有几个关键问题导致代码失效:
- 函数内部没有返回生成的
slicedArray,调用后会得到undefined,和数组元素相乘直接变成NaN - 给
end赋值时误用了全等运算符===,应该用赋值运算符= - 调用
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
三、面试备考时使用内置方法的看法
- 以面试官要求为核心:如果面试官明确禁止使用内置函数(如
slice、map等),必须手动实现对应逻辑,这考察的是你对底层原理的理解;若无明确限制,合理使用内置方法能让代码更简洁可读,完全没问题。 - 底层实现必须掌握:哪怕平时常用内置方法,也要清楚它的底层逻辑(比如
slice如何创建新数组),面试中很可能要求你手动实现这类方法,这是高频考察点。 - 更优的无内置函数递归写法:可以不用创建新数组(不管
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
- 思路比写法重要:面试时重点是你能清晰讲出递归的终止条件、递归步骤,以及对问题的拆解逻辑,不管用不用内置方法,只要思路清晰,就是加分项。
内容的提问来源于stack exchange,提问作者Mikey Navarro
相关产品推荐
相关产品推荐

