python - 我的递归生成字符串的所有排列的解决方案如何工作?
问题描述
def permutationString(word):
print('word', word)
result = []
if len(word) == 0:
result.append('')
return result
for i in range(len(word)):
before = word[0 : i]
after = word[i + 1 :]
print('before',before)
print('after', after)
partials = permutationString(before + after)
print(partials)
for s in partials:
result.append(word[i] + s)
return result
这是我为给定字符串生成排列的解决方案。
对于 input abc
,它给了我['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
这似乎是正确的。
我的问题是,我真的不明白魔法是如何运作的。代码本身非常直观;我们只是尝试将每个字符作为第一个字符,然后附加排列。
但我真的不明白它partials
是如何生成的,我不确定当我们不这样做result.append('')
时解决方案是如何工作的word
。
是否有关于魔法如何运作的直观解释?
解决方案
我在这里有一个完整的答案。
较短的答案是只有一种方法可以编写没有元素的序列。那是空序列。所以具有 的所有排列的列表''
是 ['']
。
假设你弄错了然后返回[]
,也就是说,没有解决方案。那时会发生什么?
好吧,在归纳的情况下,正如您所说,您尝试将每个元素作为第一个元素,并将其放在没有该元素的排列解决方案的前面。所以考虑一个只有一个元素的序列'x'
。你将把x
所有解决方案放在前面''
。''
如果返回的排列[]
是一个没有解决方案的空列表,那么您将没有解决方案可以放在x
前面。但是它会返回['']
,因此您将放在'x'
那个解决方案的前面''
。
奖金
一旦你认为你明白了,你可能想尝试另一种类似的算法来计算排列。
尝试构建在每个递归步骤中word
仅选择第一个元素的所有排列word[0]
,并以某种方式将其与排列的解决方案“组合” word[1:]
。
推荐阅读
- windows - 用于从树中自动删除指定文件夹的批处理文件
- python - 如何将对象转换为日期时间索引
- python - 有没有其他方法可以找到具有低开销和高精度的记录之间的相似性度量(除了 Jaro-Winkler 算法)?
- android - 为多设备支持扩展 gradle 任务
- python - 从python中的列表元素中删除字符
- java - 检查不重复的随机数
- android - 用于相机的具有透明度的矩形框
- mysql - MySQL 复制在 Master 上具有 NULL-able 列,在 Slave 上具有 NOT NULL
- rspec - Rails 5 Api 中的 rspec 控制器测试仍然很常见吗?
- python - Jupyter Notebook 不会输出