Javascript递归问题

时间:2013-10-28 23:32:07

标签: javascript arrays recursion

我正在处理CodeWarrior.com问题(这一个:http://www.codewars.com/dojo/katas/521c2db8ddc89b9b7a0000c1/play/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 个答案:

答案 0 :(得分:1)

您的output变量应该是本地的。通过使用this.output,它被用作全局(或通过对象共享)。你想要它在堆栈上,以便你的递归可以工作

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

将对this.output的所有来电更改为output