【发布时间】:2021-08-01 22:10:29
【问题描述】:
Stackoverflow,我再次寻求您的帮助。
我知道还有其他关于此的主题,但我会解释是什么让我的作业与众不同。
基本上,我的函数会得到一个 0 和 1 的列表,并返回字符串的所有可能顺序。例如对于“0111”,我们将得到“0111”、“1011”、“1101”、“1110”。
这是我的代码:
def permutations(string):
if len(string) == 1:
return [string]
lst = []
for j in range(len(string)):
remaining_elements = ''.join([string[i] for i in range(len(string)) if i != j])
mini_perm = permutations(remaining_elements)
for perm in mini_perm:
new_str = string[j] + perm
if new_str not in lst:
lst.append(new_str)
return lst
问题是当我运行像“000000000011”这样的字符串时,需要很长时间来处理。应该有一种更有效的方法来做到这一点,因为它只有两个数字。所以我不应该使用索引?
如果您能找到更有效的说法,请帮助我。
(我可以使用循环,但也必须使用递归!)
【问题讨论】:
-
您可以随时查看
itertools源代码以了解它是如何实现的,如果您不想使用该模块,请执行类似的操作。 docs.python.org/3/library/itertools.html#itertools.permutations -
@PacketLoss itertools permutations 函数比我写的自定义版本还要慢,因为它会重复相似的对象。这在基本的 Python 中应该是可能的——递归、for、循环,没有 OOP。
-
您的示例“000000000011”是否应该返回
01 and 10? -
@PacketLoss 它应该返回“000000000011”、“000000000101”、“000000001001”等。
标签: python loops recursion permutation itertools