FCC Chunky Monkey Recursive

时间:2017-07-25 08:18:57

标签: javascript recursion

我刚刚完成了关于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来尝试使用代码,但返回的所有内容都是[]。

任何澄清都将非常感谢! :)

1 个答案:

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