使用递归进行重复排列 - JavaScript

3

我正在开发一个递归算法,它接受一个包含三个不同元素的数组(比如说['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;
};
1个回答

10

我猜你不是在寻找完整的可工作实现,而是想找出代码中的错误。以下是我发现的一些问题:

  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……对不起,我没有表达清楚,但我确实正在寻找使用递归的工作实现。 - zahabba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接