我一直在研究递归函数,我开始或多或少地开始理解它们.当我遇到这个并且我不理解时,我正在开展一个免费的代码阵营挑战.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
谢谢.
该steamroller
函数需要循环遍历作为函数参数提供的数组中的索引,以确保看到数组的每个索引.
但是,原始数组有许多索引,而这些索引本身可能包含多个索引,所有索引都需要依次循环.
调用concat
仅在循环的当前索引上完成,这意味着结果是当前索引的"steamrollered"表示.
原始数组传入函数: [1, [2],[3, [[4]]]]
循环从第一个索引开始:1
,它不是一个数组,因此它被推送到结果数组.
下一个循环迭代的索引[2]
是一个数组,因此被递归.
对函数的第一次递归调用接收[2]
并迭代它.
此递归调用的第一次迭代查找索引,该索引2
不是数组,因此被推送到结果数组.
......继续......
我们看到的是,当使用递归函数迭代嵌套数组时,无论嵌套如何,我们总是最终获得内部整数值.