【问题标题】:Combination of a letter using recursive使用递归组合字母
【发布时间】:2014-02-17 09:13:51
【问题描述】:

假设,如果我给 'ABC' 作为输入,那么我想要 'ABC', 'ACB', 'CAB', 'CBA', 'BAC', 'BCA' 。每个单词都有 n! 的组合,其中 n 是字母的长度。我认为递归可以使它更容易。这是我用 javascript 编写的代码:

function reArrange(word)
{
    console.log(word);
    if (word.length < 0) {
        return (-1);
    }
    else if (word.length == 0) {
        return ('');
    }
    else {
        for (var _i = 0; _i < word.length; _i++) {
            var temp = word[_i];
            for (var _j = 0; _j < word.length; _j++) {
                if (_i != _j) {
                    return word[_i] + reArrange(word.slice(_i, word.length));
                }
            }
        }
    }
}

请使用详细的注释。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/6359344/…
  • 我真的很好奇这个用例是什么
  • 问题是什么?如果您想要代码审查,请在CodeReview.SE 中发布
  • “我认为递归可以使它变得更容易”(这是我能找到的最接近您问题中的问题或请求的东西) - 函数 递归的。

标签: javascript algorithm logic combinations


【解决方案1】:
function combinations(current_string, actual_string, seen) {
    var result = [];
    if (current_string.length === actual_string.length) {
        return [current_string];
    }
    actual_string.forEach(function(currentChar, index) {
        if (seen.indexOf(index) === -1) {
            result = [].concat.apply(result, combinations(current_string
                + currentChar, actual_string, seen.concat(index)));
        }
    });
    return result;
}

console.log(combinations("", "ABC".split(""), []));

输出

[ 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA' ]

注意:此程序在输入字符串中的字符是唯一的假设下工作。

有三个参数传递给这个函数。第一个是使用递归构建的当前字符串,第二个是实际字符串中的字符数组,第三个是已经在递归树中看到的索引列表。

第一个 if 条件是此递归解决方案的基本条件。如果当前生成的字符串的长度等于实际字符串的长度,则我们没有剩余的字符要处理,这是组合之一。所以,我们将其返回。

如果不满足该条件,对于实际字符串中的每个字符,我们检查它是否已被使用(我们将索引与seen 中的索引进行比较)。如果它已经在当前递归中使用,请忽略它。否则,将其与当前字符串连接,并将其包含在所见变量中并立即递归。

递归的结果将是一个字符串数组。我们需要将它们展平(连接内部数组的所有元素)。所以,我们使用[].concat.apply

最后,我们返回收集的结果,这是递归树的样子

【讨论】:

  • 我个人不喜欢“仅代码”的答案,尤其是当 OP 似乎试图理解某些东西时——而不仅仅是让它发挥作用。您应该努力解释代码正在实现的逻辑。
  • @amit 请检查一下,我已经用图表做了一些解释。
  • js 代码我不能判断,因为我不熟悉它,但现在解释得很好。很好的答案。
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2019-04-09
  • 2015-06-25
相关资源
最近更新 更多