2016-04-01 5 views
0

配列値をずらした形でペアリングしようとしました。例えば配列の最大呼び出しサイズが再帰に達しました

は、機能を通過した後、私は、コールスタックエラーを取得していますなぜすべてのアイデア

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

するnew_arrを探していますか?どこかでメモリリークがありませんか?

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)); 
+0

'typeof null === 'object'' – Alnitak

+0

' min === null'を使用してください –

+2

どのようにして再帰が終了しますか? –

答えて

0

そのforループなしの再帰とやや簡単な方法:再帰が発生し、その中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

+0

この関数のユーザーは、これが元の配列を破壊することに注意する必要があります。 – Alnitak

+0

それは良い点です。私はそれをちょっと試してみます。 – Andy

+0

再帰的に繰り返すのではなく、反復的に書くのは簡単でしょう:p – Alnitak

1

はあなたの関数は再帰の上限に当たりますそれは常に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; 
} 

:言っ

は、実際に再帰的にこの関数を記述する必要はありません。

関連する問題