JS中的递归函数问题

时间:2018-08-25 22:59:21

标签: javascript recursion

所以我需要使用递归来严格解决这个问题

// 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并返回剩余的数组了...

有人可以解释一下我在做什么错吗?

谢谢! :)

4 个答案:

答案 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}}