函数中的递归调用如何工作?

时间:2018-09-29 06:55:56

标签: javascript arrays algorithm recursion methods

此算法的目的是返回一个数组,该数组在其中分成较小的二维数组。每个内部数组的长度由size定义。 .slice()方法的递归调用在这里如何工作? 它如何使函数返回将数组拆分为较小的子数组? 我不明白这种解决方案。

function chunkyArrayInGroups(arr, size){
    if(arr.length <= size){
        return [arr];
    } else {
        return [arr.slice(0, size)].concat(chunkyArrayInGroups(arr.slice(size), size));
    }
}

1 个答案:

答案 0 :(得分:3)

在调用堆栈上时,从数组前面(.slice(size))切下块:

 [0, 1, 2, 3, 4, 5] -> [2, 3, 4, 5] -> [4, 5] -> []

现在,在每个递归调用中,都存在一个中间值,该中间值包含被切掉的部分(.slice(0, size)):

                   [0, 1]             [2, 3]       [4, 5]

现在,当堆栈展开时,分块的部分将串联在一起:

                   [0, 1]           [2, 3]        [[4, 5]]
                   [0, 1]          [[2, 3], [4, 5]]
                  [[0, 1], [2, 3], [4, 5]]