2017-07-25 67 views
0

我剛剛完成了FCC上的矮胖猴子行動,雖然我期待改善我的解決方案,但我偶然發現了一個使用遞歸的替代模型。FCC矮胖猴子遞歸

function chunkArrayInGroups(arr, size) { 
    // Break it up. 
    var mArr = []; 

    function newChunks (arr, size, mArr){ 
    if (arr.length > 0){ 
     mArr.push(arr.splice(0, size)); 
     newChunks(arr, size, mArr); 
    } 

    } 
    newChunks(arr, size, mArr); 
    return mArr; 
} 

我理解它的第一部分,但最後一部分對我有點困惑。爲什麼newChunk被再次調用?

newChunks(arr, size, mArr); 
     return mArr; 
    } 

我試圖通過消除newChunks和簡單地返回馬爾玩弄的代碼,但都被退回,這是[]。

任何澄清將不勝感激! :)

+1

什麼運動? – Aron

+0

'newchunks(arr,size,mArr);'是發起點 – azad

+0

@Aron,矮胖的猴子! –

回答

0

爲什麼newChunk被再次調用?

它不叫再次在最後。如果沒有最後的調用,它將永遠不會被調用,因爲唯一的另一個調用是遞歸調用(它稱爲自己的調用)。最後的調用是啓動遞歸過程的。

當調用newChunks時,如果傳入的數組至少有一個條目,它將刪除一個塊並將其推送到myArr。如果有更多的塊要做,它會自動調用。


邊注:即實現修改它給陣列(具體地,它清空出來,因爲它使用splice,這是一個增變方法)。通常,像newChunks這樣的函數應該只保留輸入數組。

這裏有一個解決方案,這樣的一個,避免造成不必要的陣列,但不修改原:

function chunkArrayInGroups(arr, size) { 
 
    function worker(index, source, dest, size) { 
 
    if (index < source.length) { 
 
     dest.push(source.slice(index, index + size)); 
 
     worker(index + size, source, dest, size); 
 
    } 
 
    } 
 
    
 
    var result = []; 
 
    worker(0, arr, result, size); 
 
    return result; 
 
} 
 

 
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
 
console.log(JSON.stringify(chunkArrayInGroups(a, 3))); 
 
console.log(JSON.stringify(a));

+0

因此,在這種情況下索引會引用當前正在被函數檢查的數組中元素的位置? 糾正我,如果我錯了,但這是我目前爲止的理解 1.函數需要arr和每個嵌套數組的指定大小 2.然後創建一個名爲result的空數組 3.函數worker是然後調用以創建最終產品 4.它從索引零的第一個元素開始,運行,然後再次調用自身,因爲元素的索引始終小於長度。 5.這一直持續到預期的結果。 –

+0

@IvanLeo:完美! (當它自己調用時,它會傳遞一個更新的'index'。) –