[英]Recursive function issue in JS
所以我需要使用递归来解决这个问题STRICTLY
// 2. Compute the sum of an array of integers. // sum([1,2,3,4,5,6]); // 21
然后我在PythonLive中测试这个解决方案
var sum = function(array) { if(array.length===0){ return array } return array.slice(0,array.length)+sum(array.pop()) }; sum([1,2,3,4,5,6]);
然后在第6步它说“TypeError:array.slice不是一个函数”
我不明白为什么如果它已经工作从数组中取出6并返回剩余的数组...
有人可以解释一下我做错了吗?
谢谢! :)
如果查看返回值,您将看到始终返回一个数组。 当你想要一个数字作为最终结果时,这是不对的。 当array.length === 0
你可以安全地返回0,因为它与空数组相同。 这是你的边缘条件。 之后你只需要一个元素和其余元素的总和。
你也可以在它为零时返回数组长度,以获得非常简洁的解决方案。 &&
shortcircuits返回左侧元素,如果它是假的(如0),否则第二个:
var sum = (array) => array.length && array.pop() + sum(array) console.log(sum([1,2,3,4,5,6]));
如果您更喜欢slice
您也可以这样,这基本上是相同的:
var sum = (array) => array.length && array[0] + sum(array.slice(1)) console.log(sum([1, 2, 3, 4, 5, 6]));
您的代码的问题在于您正在以错误的方式处理值,它应该是
return sum(array.slice(0,array.length-1)) + array.pop();
事实上,因为array.pop()
删除了元素,你可以这样做:
return array.pop() + sum(array);
当array.length===0
,您还需要返回0
,否则总和将失败。
if (array.length===0) return 0;
然而,通过reduce
这样做更简单:
let arr = [1,2,3,4,5,6]; console.log(arr.reduce((t, v) => { return t + v; }, 0));
递归和函数:
const sum = list => {
if (!list.length) return 0;
return list.pop() + sum(list);
};
因为.pop
改变数组,所以不需要使用切片。 对于非破坏性版本(不会更改原始数组):
const sum = ([first, ...rest]) => {
if (first === undefined) return 0;
return first + sum(rest);
};
使用显式empty
和纯表达式的另一种编码
const empty = x => x === empty const sum = ([ x = empty, ...rest ]) => empty (x) ? 0 : x + sum (rest) console.log ( sum ([ 1, 2, 3, 4, 5 ]) // 15 , sum ([]) // 0 )
你问的如何对嵌套数组求和的另一个问题被搁置了,原因我不明白。 您可以调整上述实现以支持嵌套数组的输入
const empty = x => x === empty const sum = ([ x = empty, ...rest ]) => empty (x) ? 0 : Array.isArray (x) ? sum (x) + sum (rest) : x + sum (rest) console.log ( sum ([ 1, [ 2, [ 3, 4 ], 5 ]]) // 15 , sum ([ 1, 2, 3, 4, 5 ]) // 15 , sum ([[[]]]) // 0 , sum ([]) // 0 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.