当前位置:  开发笔记 > 编程语言 > 正文

循环内的递归函数

如何解决《循环内的递归函数》经验,为你挑选了1个好方法。

我一直在研究递归函数,我开始或多或少地开始理解它们.当我遇到这个并且我不理解时,我正在开展一个免费的代码阵营挑战.for循环内部的递归函数:

function steamroller(arr) {
   var newArr = [];

    for (var i = 0; i < arr.length; i++) {
       //If (i)th element is an array
       if (Array.isArray(arr[i])) {
          newArr = newArr.concat(steamroller(arr[i]));
          console.log(newArr);
       } else {
          newArr.push(arr[i]);
       }
   }
   return newArr;
}
steamroller([1, [2],[3, [[4]]]]);
//returns [1, 2, 3, 4]

我很难理解的一句话是:

newArr = newArr.concat(steamroller(arr[i]));

在那条线上,newArr是连接到什么?在.concat方法中再次调用该函数,对吧?但是那个for循环会发生什么?函数调用concat方法是否强制循环退出?

这是一个JSFiddle,我每个都newArr登录到控制台,但我甚至无法遵循它.该数组的构建方式如下:

[1, 2]
[4]
[3, 4]
[1, 2, 3, 4] //Final

谢谢.



1> Greg..:

steamroller函数需要循环遍历作为函数参数提供的数组中的索引,以确保看到数组的每个索引.

但是,原始数组有许多索引,而这些索引本身可能包含多个索引,所有索引都需要依次循环.

调用concat仅在循环的当前索引上完成,这意味着结果是当前索引的"steamrollered"表示.

一步步

    原始数组传入函数: [1, [2],[3, [[4]]]]

    循环从第一个索引开始:1,它不是一个数组,因此它被推送到结果数组.

    下一个循环迭代的索引[2]是一个数组,因此被递归.

    对函数的第一次递归调用接收[2]并迭代它.

    此递归调用的第一次迭代查找索引,该索引2不是数组,因此被推送到结果数组.

    ......继续......

我们看到的是,当使用递归函数迭代嵌套数组时,无论嵌套如何,我们总是最终获得内部整数值.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有