2011-06-29 4 views
0
>>> def clockwise(r): 
...  return list(r[0]) + clockwise(list(reversed(zip(*r[1:])))) if r else [] 
... 
>>> a = [ 
... [ 1, 2, 3], 
... [ 5, 6, 7], 
... [ 9, 10, 11]] 
>>> clockwise(a) 
[1, 2, 3, 7, 11, 10, 9, 5, 6] 

私は関数を時計回りにJavascriptに変更しようとしていますが、動作させられないようです。PythonからJavascript

私は、同様の機能を持ついくつかのメソッドを作成しました:

function zip(masterArray){//zips 2 arrays 
var innerLoop = masterArray.length; //inner loop 
var outerLoop = 0; 
//get length of shortest 
for (var i = 0; i<masterArray.length;i++){ 
    var a = masterArray[i].length; 
    if (outerLoop==0){outerLoop = a;}else if(a < outerLoop){outerLoop = a;} 
} 

var newOuterArray = new Array(outerLoop); 
    for (var x = 0; x<outerLoop;x++){ 
     var newInnerArray = new Array(innerLoop); 
      for (var y = 0; y<innerLoop;y++){ 
       newInnerArray[y] = masterArray[y][x]; 
       } 
      newOuterArray[x] = newInnerArray; 
} 
return newOuterArray; 
} 

function reversed(arr){ 
    var newArray = new Array(arr.length); 
    var n = 0; 
    for(var i=arr.length-1; i>=0; i--){ 
     newArray[n++] = arr[i]; 
    } 
    return newArray; 
} 

function clockwise(r){ 

    if(r.length>0){ 
      var a = reversed(zip(r.slice(1))); 
      a.splice(0,0,r[0]); 
      return clockwise(a); 
    }else{ 
     return []; 
    } 
} 

ここに私の進捗状況です。私は最後の部分で立ち往生しています:火かき棒の時計回りのエラーはあまりにも多くの再帰です。

答えて

2

私は問題がスプライスの使用にあると思う。 ...

function clockwise(r){ 
    if(r.length>0){ 
     var remaining = r.slice(1) 
     var a = reversed(zip(remaining)); 
     return r[0].concat(clockwise(a)); 
    } else { 
     return []; 
    } 
} 
+0

はSO MUCHありがとうございました! – hamahama

1

を代わりにこのような何かを試してみてください私はあなたがそうでなければ、空の文字列に取り掛かることはありませんあなたはr[0]を付加する前にするclockwise()への再帰呼び出しをしたいと思います。

+0

私はそれを今、感謝! – hamahama

0

私はアルゴリズムが何をしようとしているのかを追っていませんが、clockwiseのJavascriptバージョンは[]を返すことしかできないようです。 2つのリターンパスがあります。 1つは時計回りに呼び出され、もう1つは[]を返すので、その関数から[]を返すことができます。それはあなたのpythonバージョンの仕組みではありません。

私は逆とジップを見ていませんが、時計回りのjavascriptバージョンには論理的な違いがあります。 javascriptのバージョンでは、配列の最初の項目を削除してから、逆にしてzipし、最初の項目を配列に戻し、全体を時計回りに呼び出します。 Pythonバージョンでは、配列内の最初のアイテムをremvoeし、クロックを呼び出し、最初のバージョンを持たないアイテムのみを逆にしてから、後で最初のアイテムを追加します。非常に異なるロジック。 Pythonのバージョンは終了する可能性が非常に高いです。他の機能は逆とZIPで

私は見ていないが、これは時計回りのJavaScriptのより忠実なバージョンのようになります。

function clockwise(r) { 
    if (r.length > 0) { 
     var a = clockwise(reversed(zip(r.slice(1)))); // call clockwise on array starting at index 1 
     a.splice(0,0,r[0]);        // put first value in original array back onto the beginning of the result 
     return (a);          // return new array 
    } else { 
     return []; 
    } 
}