【问题标题】:Permutations with repetition using recursion - JavaScript使用递归的重复排列 - JavaScript
【发布时间】:2015-08-01 03:37:29
【问题描述】:

我正在研究一种递归算法,它接收一个包含三个不同元素的数组(比如['a', 'b', 'c'] 并返回一个二维数组,其中包含允许重复的所有可能变化(所以[['a', 'a', 'a'], ['a', 'a', 'b'], ['a', 'b', 'b'],...])。但是我的代码失败了,我不知道为什么。

var abc = function () {
  var holdingArr = [];
  var threeOptions = ["a", "b", "c"];
  var singleSolution = [];  
  var recursiveABC = function(arr) {
      if (singleSolution.length > 2) {
        holdingArr.push(singleSolution);
        singleSolution = [];
        return;
      }
      for (var i=0; i < arr.length; i++) {
        recursiveABC(arr.slice(i+1));
      }
  };
  recursiveABC(threeOptions);
  return holdingArr;
};

【问题讨论】:

    标签: javascript arrays algorithm recursion permutation


    【解决方案1】:

    我假设您不是在寻找完整的工作实现,而是在寻找代码中的错误。以下是我找到的一些:

    1. 您没有保持变量名称一致:holdingArrayholdingArr
    2. 您实际上从未将任何内容推送到 singleSolution

    编辑:这是一个基于您的原始代码的工作实现。

    var abc = function () {
      var holdingArr = [];
      var threeOptions = ["a", "b", "c"];
      var recursiveABC = function(singleSolution) {
          if (singleSolution.length > 2) {
            holdingArr.push(singleSolution);
            return;
          }
          for (var i=0; i < threeOptions.length; i++) {
            recursiveABC(singleSolution.concat([threeOptions[i]]));
          }
      };
      recursiveABC([]);
      return holdingArr;
    };
    

    您基本上希望每个递归函数调用都在其自己的singleSolution 副本上工作,而不是在闭包范围内保留一个通用函数。而且,由于到目前为止我们正在迭代选项而不是解决方案,因此没有必要让递归函数将选项作为参数。

    【讨论】:

    • 谢谢。 #1 只是一个转录错字(已修复)。 #2 是一个很好的问题...不确定我应该在singleSolution 推送什么(以及在哪里)...抱歉,我不太清楚,但我正在寻找一个可行的实现使用递归。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2019-06-10
    • 2012-09-30
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多