【发布时间】:2015-12-06 21:30:29
【问题描述】:
我正在练习递归,并试图在不循环的情况下展平数组(仅限递归)。作为第一步,我采用了迭代方法,它奏效了,但我坚持使用纯递归版本:
function flattenRecursive(arr) {
if (arr.length === 1) {
return arr;
}
return Array.isArray(arr) ? arr = arr.concat(flattenRecursive(arr)) : flattenRecursive(arr.slice(1))
}
console.log(flattenRecursive([
[2, 7],
[8, 3],
[1, 4], 7
])) //should return [2,7,8,3,1,4,7] but isn't - maximum call stack error
//working version (thanks @Dave!):
function flattenRecursive(arr) {
if (arr.length === 1) {
return arr;
}
return arr[0].concat(Array.isArray(arr) ? flattenRecursive(arr.slice(1)) : arr);
}
console.log(flattenRecursive([
[2, 7],
[8, 3],
[1, 4], 7
]))
//returns [ 2, 7, 8, 3, 1, 4, 7 ]
【问题讨论】:
-
提示:
Array.isArray(arr)永远为真 -
arr.concat(flattenRecursive(arr))导致无限递归。 -
@charlietfl - 第一次调用该函数时为真,然后使用相同的参数再次调用该函数 -
arr- 因此将始终为真。它永远不会到达数组中的最后一项。 -
只是好奇为什么要递归执行此操作。如果您不想就地执行它,那么执行它是微不足道的。这是一个思考练习吗?
-
@torazaburo 巩固我对递归的理解的练习(学术):) 你将如何做到这一点?
标签: javascript arrays recursion