递归平坦化数组(不循环)

Flattening an array recursively (withoout looping) javascript

本文关键字:循环 数组 递归      更新时间:2023-09-26

我正在练习递归,并试图在不循环(递归)的情况下扁平化数组。作为第一步,我使用了迭代方法,它很有效,但我被困在了纯递归版本上:

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 ]

这是一个稍微不那么冗长的工作版本。

//using reduce
function flattenRecursive(arr) {
  return arr.reduce(function(result, a){
    return result.concat(Array.isArray(a) ? flattenRecursive(a) : a);
  }, []);
}
//without reduce
function flattenRecursive2(arr) {
  if (arr.length === 0)
    return arr;
  var head = arr.shift();
  if (Array.isArray(head))
    return flattenRecursive2(head).concat(flattenRecursive2(arr));
  else
    return [head].concat(flattenRecursive2(arr));
}
var testArray = [1,[2, 3],[[4, 5, [6, 7]], [8, 9]], 10];
console.log(flattenRecursive(testArray));
console.log(flattenRecursive2(testArray));
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

对不起,我没有评论的声誉。这是我的2美分。

1)小心你的初始条件。在这里,如果你的输入是arr = [[1,2]],你的函数返回[[1,2]],而你希望它返回[1,2]

2)在递归的核心,你必须确保你递归地调用你的函数与smaller argument. Here, you should concat the first element of your array with the flattened rest of the array. The function片可能是方便的。

3)也可以使用类似于约简的函数。