我刚刚完成了关于FCC的Chunky Monkey运动,当我想要改进我的解决方案时,我偶然发现了一个使用递归的替代模型。
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;
}
我理解它的第一部分,但最后一部分对我来说有点混乱。为什么newChunks再次被召唤?
newChunks(arr, size, mArr);
return mArr;
}
我尝试通过删除newChun并简单地返回mArr来尝试使用代码,但返回的所有内容都是[]。
任何澄清都将非常感谢! :)
答案 0 :(得分:0)
为什么newChunks再次被召唤?
最后不再称为 。如果没有最后的调用,它将永远不会被调用,因为对它的唯一其他调用是递归调用(它调用自身的调用)。最后的调用是启动递归过程的原因。
当调用newChunks
时,如果传入的数组至少有一个条目,它会删除一个块并将其推送到myArr
。然后它会调用自己,以防有更多的块。
附注:该实现修改它给出的数组(具体来说,它将其清空,因为它使用splice
,这是一个mutator方法)。通常,像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));