所以我需要使用递归来严格解决这个问题
// 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并返回剩余的数组了...
有人可以解释一下我在做什么错吗?
谢谢! :)
答案 0 :(得分:2)
如果查看返回值,将会看到您总是在返回数组。当您想要一个数字作为最终结果时,这可能是不对的。当array.length === 0
时,您可以安全地返回0,因为它与空数组相同。那是你的优势。之后,您只需要一个元素加其余元素的总和。
您也可以只返回零时的数组长度,这是一个非常简洁的解决方案。 &&
短路返回左元素是否为假(如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]));
答案 1 :(得分:1)
您的代码存在的问题是您正在错误地处理值,应该是
return sum(array.slice(0,array.length-1)) + array.pop();
实际上,由于array.pop()
删除了元素,因此您可以按照以下方式进行操作:
return array.pop() + sum(array);
您还需要在0
时返回array.length===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));
答案 2 :(得分:1)
递归求和函数:
const sum = list => {
if (!list.length) return 0;
return list.pop() + sum(list);
};
由于.pop
会改变数组,因此您无需使用slice。对于非破坏性版本(不会更改原始数组):
const sum = ([first, ...rest]) => {
if (first === undefined) return 0;
return first + sum(rest);
};
答案 3 :(得分:0)
另一种使用显式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
)
您的另一个询问reprex package的问题由于我不明白的原因而被搁置。您可以修改上述实现以支持嵌套数组的输入
{{1}}