【问题标题】:String permutations using recursion使用递归的字符串排列
【发布时间】:2016-04-10 08:55:06
【问题描述】:

例如,如果我有一个字符串 {a, b, c}。我需要在控制台上打印出所有排列,而不需要像这样重复从 1 个字母到 3 个字母的字母:

a b c ab ac abc acb ba bc bac bca ca cb cab cba

如何使用递归来编写?

【问题讨论】:

  • 它是什么?回溯还是递归?我做过类似的事情,回溯通常更容易。此外,您可以使用全局堆栈执行“递归”算法,但实际上并不执行真正的函数递归。
  • @ChrisMartin 该列表确实cbbc [并且在您编辑之前做过]。所以,可能是排列

标签: algorithm recursion


【解决方案1】:

如果您需要将字符的所有排列转换为字符串,您可以使用递归函数。

这是 Swift 中的代码。

func visit(unused:[Character], used: [Character] = [Character]()) -> [String] {
    var result = [String(used)]
    for (index, char) in unused.enumerate() {
        var unused = unused
        unused.removeAtIndex(index)
        var used = used
        used.append(char)
        result = result + visit(unused, used: used)
    }
    return result
}

如您所见,该函数接收 2 个参数:

  • unused:表示尚未使用的字符列表
  • used:用于构建输出的可能元素的字符。此参数是可选的,因此如果未将其传递给函数,则使用空数组(这对于第一次调用很有用)。

测试

let word = "abc"
let chars = [Character](word.characters)
print(visit(chars))

["", "a", "ab", "abc", "ac", "acb", "b", "ba", "bac", "bc", "bca", "c", "ca", "cab", "cb", "cba"]

省略空字符串

此结果还包含空字符串,但您可以轻松省略此值,只需更新函数,如下所示。

func visit(unused:[Character], used: [Character] = [Character]()) -> [String] {
    var result = [String]()
    if !used.isEmpty {
        result.append(String(used))
    }
    for (index, char) in unused.enumerate() {
        var unused = unused
        unused.removeAtIndex(index)
        var used = used
        used.append(char)
        result = result + visit(unused, used: used)
    }
    return result
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-07
    • 2023-04-11
    • 2012-08-24
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2017-01-18
    相关资源
    最近更新 更多