2013-10-28 59 views
0

我做了CodeWarrior.com問題(這一個:http://www.codewars.com/dojo/katas/521c2db8ddc89b9b7a0000c1/play/javascript)。的Javascript遞歸問題

我用Python實現它首先,我的代碼工作正常,但在Javascript中,我不能得到線output.push(snail(data)); return flattenArray(this.output);工作。以遞歸方式調用該方法似乎允許子方法編輯父方法內的變量。

我如何防止這種情況(如果這是發生了什麼)?

這裏是我的代碼:

snail = function(data) { 
    console.log("snail - " + data); 
    this.output = []; 
    // Get the top row 
    this.output.push(data.splice(0,1)); 

    if(data.length == 0) { 
    return this.output; 
    } 

    // Get the right row 
    for(var layer=0;layer<data.length;layer++) { 
    this.output.push(data[layer].splice(data[layer].length - 1,1)); 
    } 

    // Get the bottom row 
    this.output.push(data.splice(data.length - 1,1)); 

    // Get the left row 
    for(var layer=0;layer<data.length;layer++) { 
    this.output.push(data[layer].splice(0,1)); 
    } 

    if(data.length!=0) { 
    output.push(snail(data)); 
    return flattenArray(this.output); 
    } else { 
    return this.output; 
    } 
} 

function flattenArray(arr) { 
    var r = []; 
    while (!arrayEqual(r, arr)) { 
    r = arr; 
    arr = [].concat.apply([], arr); 
    } 
    return arr; 
} 

function arrayEqual(a, b) { 
    var i = Math.max(a.length, b.length, 1); 
    while(i-- >= 0 && a[i] === b[i]); 
    return (i === -2); 
    } 

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 
+1

是什麼'this'你的蝸牛功能裏面是什麼意思?如若'output.push(蝸牛(數據));'是'this.output.push(蝸牛(數據));'我想你誤會了'this'這裏 –

+0

'output.push(蝸牛(數據)) ;'調用推送一個名爲output的(可能不存在的)全局對象。既然你用'this.output'返回了一些東西,你可能需要'this.output.push(snail(data));'。 – Evan

+0

我添加了'this.output'而不是'output'來試圖阻止這個問題。它似乎沒有影響程序的運行。 –

回答

1

output變量應該是局部的。通過使用this.output,它被用作全局(或通過對象共享)。你想讓它在棧上,這樣你可以遞歸工作

snail = function (data) { 
    var output = []; 

改變所有的調用this.outputoutput