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