2017-08-31 53 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,1,2,1,1,1])=> [8,2,3]

有沒有更好的方法來做到這一點?

+0

'while(result [0] === result [1])'終止條件似乎不正確。我建議監測結果長度是否改變。 –

回答

0
  • 始終使用純函數。
  • 總是與輸入數組的第一個元素一起工作。
  • ,同時它具有重複:收集他們
  • 呼叫self直到輸入數組被消耗
  • 回報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

通過採取使用數組的解構在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函數的參數解構陣列也以類似的方式工作。