【问题标题】:Recursive solution : string permutation. Unable to return array of permutation strings in javascript递归解决方案:字符串排列。无法在 javascript 中返回排列字符串数组
【发布时间】:2016-12-13 12:45:53
【问题描述】:

这是我的 js:-

function recPerm(rest, soFar) { 
    var next;
    var remaining;
    var output=[];
    if (rest === '') {
        console.log(soFar); //outputting strings..and this works
        output.push(soFar); 
    } else {

        for (var i = 0; i < rest.length; i++) {
            remaining = rest.substr(0,i) + rest.substr(i+1,rest.length-1);
            next = soFar + rest[i];
            recPerm(remaining, next);
        }

    }
    return output; //returns an empty array in the end
}

var out=recPerm('abc',''); 
console.log(out);  //prints empty array

递归地,我正在尝试打印输入字符串的排列。我正在传递输入字符串和一个空白字符串,然后递归地调用这个函数,并使用剩余的字符串和字符串中的下一个单独的字符来考虑。在基本情况下,我成功地记录了单个字符串。但不知何故,它没有将它保存在我的数组中。我的 JS 中是否遗漏了什么?

【问题讨论】:

  • 在你的函数中你应该做类似output.push(somevalue);
  • recPerm 的每次调用都会创建并返回一个新数组,然后您将在递归调用中忽略它。您需要将该返回数组的内容添加到调用方范围内的数组中。
  • String.prototype.substr() 将子字符串的长度作为第二个参数。我猜你在传递索引时可能是错的。

标签: javascript arrays string recursion


【解决方案1】:

您的问题出在output 变量上,该变量是recPerm 函数的私有变量,当您递归调用recPerm 时,当然会重新创建它...我建议您将该变量作为参数传递:

function recPerm(rest, soFar, output) { 
  var next;
  var remaining;
  output = Array.isArray(output) ? output : [];
  
  if(rest === '') {
    output.push(soFar); 
  } else {

    for (var i = 0; i < rest.length; i++) {
      remaining = rest.substr(0,i) + rest.substr(i+1,rest.length-1);
      next = soFar + rest[i];
      recPerm(remaining, next, output);
    }
    
  }
  
  return output; //returns an empty array in the end
}

var out=recPerm('abc',''); 
console.log(out); 

【讨论】:

  • 很好的解决方案。谢谢
  • 发布您的答案的解释。这些纯代码答案质量低下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2012-08-24
  • 2017-02-17
  • 1970-01-01
相关资源
最近更新 更多