最大调用大小在数组上递增

时间:2016-04-01 17:05:08

标签: javascript

尝试以交错的形式配对数组值。

例如,在完成该功能后,我正在寻找new_arr

['team1', 'team8', 'team2', 'team7', 'team3', 'team6', 'team4', 'team5']

知道为什么我收到调用堆栈错误?我在某处错过了内存泄漏吗?

var arr = ['team1', 'team2', 'team3', 'team4', 'team5', 'team6', 'team7', 'team8'];
var new_arr = [];

function staggered(arr, new_arr, min = null, max = null) {
    for (var i=0, j=arr.length-1; i < arr.length / 2; i++, j--) { 
        if(typeof min === "null") { min = i;}
        if(typeof max === "null") { max = j;}
        new_arr.push(new_arr, arr[min], arr[max]);
        return staggered(arr, new_arr, i + 1, j - 1);
    }
}

console.log(staggered(arr, new_arr));

2 个答案:

答案 0 :(得分:1)

您的函数遇到递归限制,因为递归发生的for循环始终被调用,因为它始终从0运行到arr.length / 2,并且但是当你递归时,arr总是保持相同的长度。

那就是说,实际上没有必要递归地写这个函数:

function staggered(arr) {
    var res = [];
    for (var i = 0, j = arr.length; i < j; ) {
       res.push(arr[i++]);
       res.push(arr[--j]);
    }
    return res;
}

给定一个奇数大小的输入数组,最后一个配对将中间条目与自身组合(又名&#34; by&#34;)。

答案 1 :(得分:0)

一种稍微简单的递归方法,没有for循环:

function staggered(arr, new_arr, i) {
  if (arr.length === 0) return new_arr;
  if (!i) arr = arr.slice(0);
  new_arr = new_arr || [];
  new_arr.push(arr.shift(), arr.pop());
  return staggered(arr, new_arr, 1);
}

DEMO