我刚刚在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;
}我尝试通过删除newChunks并简单地返回mArr来修改代码,但返回的结果都是[]。
任何澄清都将不胜感激!:)
发布于 2017-07-25 16:22:14
为什么再次调用newChunks?
它不会在结束时再次调用。如果没有最后的调用,它将永远不会被调用,因为对它的唯一另一个调用是递归调用(它调用自己的调用)。最后的调用启动了递归过程。
当调用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));
https://stackoverflow.com/questions/45297670
复制相似问题