循环内的递归函数

Chi*_*ard 5 javascript

我一直在研究递归函数,我开始或多或少地开始理解它们.当我遇到这个并且我不理解时,我正在开展一个免费的代码阵营挑战.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]
Run Code Online (Sandbox Code Playgroud)

我很难理解的一句话是:

newArr = newArr.concat(steamroller(arr[i]));
Run Code Online (Sandbox Code Playgroud)

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

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

[1, 2]
[4]
[3, 4]
[1, 2, 3, 4] //Final
Run Code Online (Sandbox Code Playgroud)

谢谢.

Gre*_*reg 5

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

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

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

一步步

  1. 原始数组传入函数: [1, [2],[3, [[4]]]]
  2. 循环从第一个索引开始:1,它不是一个数组,因此它被推送到结果数组.
  3. 下一个循环迭代的索引[2]是一个数组,因此被递归.
  4. 对函数的第一次递归调用接收[2]并迭代它.
  5. 此递归调用的第一次迭代查找索引,该索引2不是数组,因此被推送到结果数组.
  6. ......继续......

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