Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归地减少连续重复数的数组_Javascript_Arrays_Recursion - Fatal编程技术网

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

Javascript 递归地减少连续重复数的数组,javascript,arrays,recursion,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;

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

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;
};
还原酮([1,1,2,1,1,1,1,1,2,1,1,1])=>[8,2,3]

有更好的方法吗

  • 始终使用纯函数
  • 始终使用输入数组的第一个元素
  • 当它有副本时:收集它们
  • 调用
    self
    ,直到输入数组被使用为止
  • 返回
    res
函数reduceConsecutiveClones(nums,res){
如果(!nums.length){return res | |[];}
如果(!res){
res=[];
nums=nums.slice();
}
设sum=first=nums.shift();
而(第一个===nums[0]){
sum+=nums.shift();
}
返回还原连续克隆(
努姆斯,
res.concat(总和)
);
}
函数reduceClones(nums,res=reduceSecutiveClones(nums)){
return res.toString()==nums.toString()
?res
:还原克隆(res)
;
}
console.log(
还原分泌克隆([1,1,2,1,1,1,1,1,2,1,1,1]),
还原酮([1,1,2,1,1,1,1,1,2,1,1,1])

);通过使用Haskell式的数组解构,您可以执行以下操作:

函数sumneigboringdups([x1,x2,…xs]){
函数add2Head(a、[b、…rest]){
返回[a+b].concat(…rest);
}
返回xs.length?x1==x2?add2Head(x1,sumneigboringdups([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,1,4,4,1];
log(JSON.stringify(sumNeigboringDupes(arr))while(结果[0]==结果[1])
终止条件似乎不正确。我建议监视结果的长度是否改变。