python - 关于使用递归进行字符串排列的问题

标签 python recursion

这与递归有关。 s 是字符串“abc”。

返回 s 的所有排列。因此所需的输出是:['abc', 'acb', 'bac', 'bca', 'cab', 'cba']。 但我无法理解下面代码中的行:

"for perm in permute(s[:i] + s[i+1:]):"

“s[:i] + s[i+1:]”的第一个打印语句中,它打印出“c”而不是“bc”。我认为由于索引 i 从 0 开始(其中 i = 0 且 let = "a"),因此 "s[:0] + s[o+1:]"将变为 s[1:]

应该返回“bc”,因为“b”位于索引 1,而 c 是最后一个字母。但 print 语句却返回了“c”。

def permute(s):
    out = []

    # Base Case
    if len(s) == 1:
        out = [s]

    else:
        # For every letter in string
        for i, let in enumerate(s):

            # For every permutation resulting from Step 2 and 3 described above
            for perm in permute(s[:i] + s[i+1:]):
                print('s is ' + s)
                print('s[:i] + s[i+1:] is ' + str(s[:i] + s[i+1:]))
                print('i is ' + str(i))
                print('Current letter is ' + let)
                print('Current perm is ' + perm)

                # Add it to output
                out += [let + perm]
                print('out is ' + str(out))
                print()

    return out          

permute('abc')

s is bc
s[:i] + s[i+1:] is c
i is 0
Current letter is b
Current perm is c
out is ['bc']

s is bc
s[:i] + s[i+1:] is b
i is 1
Current letter is c
Current perm is b
out is ['bc', 'cb']

s is abc
s[:i] + s[i+1:] is bc
i is 0
Current letter is a
Current perm is bc
out is ['abc']

s is abc
s[:i] + s[i+1:] is bc
i is 0
Current letter is a
Current perm is cb
out is ['abc', 'acb']

s is ac
s[:i] + s[i+1:] is c
i is 0
Current letter is a
Current perm is c
out is ['ac']

s is ac
s[:i] + s[i+1:] is a
i is 1
Current letter is c
Current perm is a
out is ['ac', 'ca']

s is abc
s[:i] + s[i+1:] is ac
i is 1
Current letter is b
Current perm is ac
out is ['abc', 'acb', 'bac']

s is abc
s[:i] + s[i+1:] is ac
i is 1
Current letter is b
Current perm is ca
out is ['abc', 'acb', 'bac', 'bca']

s is ab
s[:i] + s[i+1:] is b
i is 0
Current letter is a
Current perm is b
out is ['ab']

s is ab
s[:i] + s[i+1:] is a
i is 1
Current letter is b
Current perm is a
out is ['ab', 'ba']

s is abc
s[:i] + s[i+1:] is ab
i is 2
Current letter is c
Current perm is ab
out is ['abc', 'acb', 'bac', 'bca', 'cab']

s is abc
s[:i] + s[i+1:] is ab
i is 2
Current letter is c
Current perm is ba
out is ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

最佳答案

这是一个非常棘手的练习问题。所以...

对于 i,让枚举: 为第一个值给出 0 a,然后将其传递给 Permute for 循环...

[0 a,1 b,2 c] 这些是此时循环中的值

"for perm in permute(s[:i] + s[i+1:]):

它调用了函数 permute() 你是对的,它传递了 bc 它再次调用 enumerate('bc') 0 b 作为第一个值,然后将其传递给... permute

[0 b,1 c] 这些是此时循环中的值

"for perm in permute(s[:i] + s[i+1:]):

看看发生了什么? 它在...c 上调用函数 permute() !这就是我们想要达到的目标。 c 是第一个 perm,因为它是一开始就添加到 out 的 len(s)==1 。绝对不是一个简单的问题。 编辑:

permute 函数获取字符串 s,并将其分割为从 s 开始到 i 索引(即 s[:i])的片段,另一部分是 s[i+1:](即 i+1)到字符串的末尾。所以在 bc 中,当 i 为 0 时,它需要 s[:0] 空字符串和 s[0+1:] ,它是索引 1 到末尾的 c 并对其进行排列。 s 现在的长度为 1,这意味着它存储在 out 中。 i 为零 abc-> bc i 为零 bc->c。 i 为 0 且 let=b 且 perm =c ,然后当 i=1 时 let 为 c 且 perm=b 。

我想到了一些可能会让你更好地理解这段代码的东西。您应该在这样的位置添加打印语句。

    # Base Case
if len(s) == 1:
    print('Length is 1 s=',s)
    out = [s]

我认为因为省略了这一点,所以很难看出何时需要调用排列。

关于python - 关于使用递归进行字符串排列的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58776831/

相关文章:

python - 如何将时间序列数据输入自动编码器网络进行特征提取?

python - 通过另一个索引或值过滤 DataFrame 索引

python - 如何在 Python 脚本中提供输入答案

python - tkinter GUI 写入文本小部件并替换文本

algorithm - 具有恒定组合时间的递归算法的时间限制

javascript - 递归渲染 React 组件

c++ - 当返回类型是 vector 容器时,是否有在 c++ 中返回 Null 的解决方法?

python - 如何使用 matplotlib 为 3D 散点图创建标记大小图例?

java - 通过回溯法解决数独问题(java)

php - 打印数组、子数组等