这与递归有关。 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/