【发布时间】:2020-03-05 16:37:26
【问题描述】:
这与递归有关。 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']
【问题讨论】:
-
第一个输出行是
s is bc,它解释了其余部分。此输出的原因是内部 for 循环在第一个print和s == 'abc'发生之前递归调用permute。