2017-08-31 19 views
3

連続重複数のアレイを減らす基地課題は、一緒に隣接するクローンを追加することにより、数字(連続重複を搭載)のアレイを低減することであった。再帰的

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]

今、sumClonesを再帰的に実行するreduceClonesという別の関数を記述しようとしています。最終出力には連続した重複が含まれません

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

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

もっと良い方法がありますか?

+0

'while(result [0] === result [1])'終了条件が正しくないようです。代わりに、結果の長さが変化するかどうかを監視することをお勧めします。 –

答えて

0
  • 常に純粋な関数を使用してください。
  • は、常に入力配列の最初の要素を処理します。
  • それは重複を有している:入力配列がHaskellesqueな方法で構造化代入アレイの使用を取ることによって
  • リターンres

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]) 
 
);

0

を消費する

  • コールselfまでそれらを収集あなたは次のようにすることができます。

    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)));

    ヒント:sumNeigboringDupes関数の引数の[x1,x2,...xs]だけ配列を受け取り、最初の項目にx1を割り当て、2番目の項目にx2xsがに割り当てられている配列であります残りの配列。 add2Headでの配列の構造解除の引数も同様のやり方で動作します。