递归地减少连续重复数字的数组

时间:2017-08-31 16:11:55

标签: javascript arrays recursion

基本挑战是通过将相邻克隆加在一起来减少一系列数字(具有连续重复):

const sumClones = (numbers) => {
 if (Array.isArray(numbers)) {
  return numbers.reduce((acc, elem, i, arr) => {
   if (elem !== arr[i - 1]) acc.push(elem);
   else acc[acc.length - 1] += elem;
   return acc;
  }, []);
 } 
}; 

sumClones([1,1,2,1,1,1,1,2,1,1,1])=> [2,2,4,2,3]

现在,我尝试编写另一个函数reduceClones,递归运行sumClones,使最终输出不包含连续重复

const reduceClones = (numbers) => {
  let result = sumClones(numbers);
  while (result[0] === result[1]) {
    result = sumClones(result);
  }
  return result;
};

reduClones([1,1,2,1,1,1,1,2,1,1,1])=> [8,2,3]

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

  • 始终使用纯粹的功能。
  • 始终使用输入数组的第一个元素。
  • 虽然它有重复:收集它们
  • 调用res直到消耗输入数组
  • return function reduceConsecutiveClones(nums, res) { if(!nums.length) { return res || []; } if(!res) { res = []; nums = nums.slice(); } let sum = first = nums.shift(); while(first === nums[0]) { sum += nums.shift(); } return reduceConsecutiveClones( nums, res.concat(sum) ); } function reduceClones(nums, res = reduceConsecutiveClones(nums)) { return res.toString() === nums.toString() ? res : reduceClones(res) ; } console.log( reduceConsecutiveClones([1,1,2,1,1,1,1,2,1,1,1]), reduceClones([1,1,2,1,1,1,1,2,1,1,1]) );

{{1}}

答案 1 :(得分:0)

通过以Haskellesque方式使用数组解构,您可以执行以下操作;

function sumNeigboringDupes([x1,x2,...xs]){
  
  function add2Head(a,[b,...rest]){
    return [a+b].concat(...rest);
  }
  
  return xs.length ? x1 === x2 ? add2Head(x1,sumNeigboringDupes([x2,...xs]))
                               : [x1].concat(sumNeigboringDupes([x2,...xs]))
                   : x1 === x2 ? [x1 + x2]
                               : [x1, x2 || []];
}

var arr = [1,1,2,1,1,1,1,2,1,1,1,4,4,1];
console.log(JSON.stringify(sumNeigboringDupes(arr)));

对于[x1,x2,...xs]函数的参数,

提示 sumNeigboringDupes只需要一个数组并将x1分配给第一个项目x2第二项和xs是一个分配给数组其余部分的数组。 add2Head函数参数的数组解构也以类似的方式工作。