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])
终止条件似乎不正确。我建议监视结果的长度是否改变。