我有以下Python代码,它使用递归返回给定字符串的所有排列的列表。我尽力了解代码的工作,但我没有这样做。任何人都可以给我一个下面提到的代码细分吗?
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 perm in permute(s[:i] + s[i+1:]):
# Add it to output
out += [let + perm]
return out
permute('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
答案 0 :(得分:0)
如果字符串的长度为1,则只有排列,因此在这种情况下它只返回该字符串。
但是,如果有更多的字母,它会遍历字符串中的每个字母,它们将被视为排列中的第一个字母,在该迭代中out
中添加。然后它会遍历字符串其余部分的每个排列,并将每个字符串添加到out
,其中let
是第一个字母。
但由于permute('aab')
不会产生['aab', 'aba', 'baa']
;每个条目将在返回的列表中两次。
为避免这种情况,请改用套装。所以out = set()
,out = {s}
和out.add(let + perm)
代替out = []
,out = [s]
和out.append(let + perm)
。