2011-06-29 45 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

太感謝你了! – hamahama

1

我想你想clockwise()遞歸調用是你前面加上r[0]之前,否則你永遠不會下降到一個空字符串。

+0

我現在明白了,謝謝! – hamahama

0

我不遵循算法試圖做什麼,但順時針的Javascript版本看起來像它只能返回[]。有兩條返回路徑。一個調用順時針,另一個返回[],所以退出該函數的唯一方法是返回[]。這不是你的python版本的工作原理。

我沒有看過反轉和zip,但在順時針的JavaScript版本中有一個邏輯差異。在javascript版本中,您將刪除數組中的第一個項目,然後反轉並壓縮,然後將第一個項目放回數組,然後順時針調用整個項目。在Python版本中,您提取數組中的第一個項目,調用時鐘並僅在沒有第一個版本的項目上反轉,然後再添加第一個項目。非常不同的邏輯。 Python版本更有可能結束。

我沒有看過其他功能扭轉和壓縮,但是這看起來像一個更忠實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 []; 
    } 
}