【发布时间】:2016-08-25 08:01:15
【问题描述】:
最近我写了一个函数来生成具有非平凡约束的某些序列。这个问题来自一个自然的递归解决方案。现在碰巧的是,即使对于相对较小的输入,序列也是数千个,因此我更愿意使用我的算法作为生成器,而不是使用它来填充所有序列的列表。
这是一个例子。假设我们想用递归函数计算一个字符串的所有排列。下面的朴素算法接受一个额外的参数“storage”,并在找到时附加一个排列:
def getPermutations(string, storage, prefix=""):
if len(string) == 1:
storage.append(prefix + string) # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], storage, prefix+string[i])
storage = []
getPermutations("abcd", storage)
for permutation in storage: print permutation
(请不要在意效率低下,这只是一个例子。)
现在我想把我的函数变成一个生成器,即产生一个排列而不是将它附加到存储列表中:
def getPermutations(string, prefix=""):
if len(string) == 1:
yield prefix + string # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], prefix+string[i])
for permutation in getPermutations("abcd"):
print permutation
这段代码不工作(函数的行为就像一个空的生成器)。
我错过了什么吗? 有没有办法将上面的递归算法变成一个生成器而不用迭代的替换它?
【问题讨论】:
标签: python recursion generator