首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FCC Chunky Monkey递归

FCC Chunky Monkey递归
EN

Stack Overflow用户
提问于 2017-07-25 16:18:57
回答 1查看 42关注 0票数 0

我刚刚在FCC上完成了Chunky Monkey练习,当我在寻找改进我的解决方案时,我偶然发现了一个使用递归的替代模型。

代码语言:javascript
复制
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?

代码语言:javascript
复制
newChunks(arr, size, mArr);
      return mArr;
    }

我尝试通过删除newChunks并简单地返回mArr来修改代码,但返回的结果都是[]。

任何澄清都将不胜感激!:)

EN

回答 1

Stack Overflow用户

发布于 2017-07-25 16:22:14

为什么再次调用newChunks?

它不会在结束时再次调用。如果没有最后的调用,它将永远不会被调用,因为对它的唯一另一个调用是递归调用(它调用自己的调用)。最后的调用启动了递归过程。

当调用newChunks时,如果传入的数组至少有一个条目,它将删除一个块并将其推送到myArr上。然后,它调用自己,以防有更多的块要做。

附注:该实现修改了给定的数组(具体地说,它清空了它,因为它使用了splice,这是一个赋值方法)。通常,像newChunks这样的函数应该让输入数组保持原样。

这里有一个解决方案,就像那个一样,避免创建不必要的数组,但不会修改原始的数组:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45297670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档