正在获取递归函数内部生成器的结果



出于纯粹的教学原因,我试图复制itertools.permutations()的功能。

一种方法是使用1列表,其中0表示给定的元素已经被使用。

例如,一个字母列表:

list_l = ['a','b','c']

并且列表CCD_ 2标记CCD_。

我把这个列表传递给同一个函数,它生成子列表[0,0,1][0,1,0],对应于第一个列表中被选中的字母b和通过消除的字母c,以及第二个列表中的字母c和b。

这种在列表位置标记字母的方法要求我为组合的每个位置保留一个历史记录,所以即使我得到了正确的结果,我也想让函数成为一个生成器,一次给出一个结果,但我不知道如何做到这一点,而不破坏递归性,从而破坏程序。我需要返回来保持历史数据的干净,以便生成下一个元素,我怀疑并行使用yield和return是否可行。

我把代码留在这里。谢谢

def generate_string(list, a):
comb = ''
for n, v in enumerate(a[0]):
if v==0:
comb = comb + lista[n]
for i in range(len(a)-1):
for n,j in enumerate(zip(a[i], a[i+1])):
if j[0] != j[1]:
comb = comb + lista[n]
for n, v in enumerate(a[-1]):
if v==1:
comb = comb + lista[n]

return comb
def comb(lista, uns = None, historial = []):
if uns == None:
l = [1] *len(lista)
comb(lista, uns = l)

else:
if sum(uns) == 1:
print(generate_string(lista, historial).upper())
return historial[:-1]
else:
for n, valor in enumerate(uns):
uns2 = copy.deepcopy(uns)
if valor == 1:
uns2[n] = 0
historial.append(uns2)
historial = comb(lista, uns2, historial) 

return historial[:-1]
lista = ['a','b','c','d']
comb(lista)

这里是进行排列的递归方法。这里的理论是,对于列表中的每个元素,您生成该元素加上列表中其他元素的排列。最终,你到达了一个没有更多选项可以置换的地方,在这一点上,你有一个完整的置换可以返回"从";是一个passthrough,只是传递从更深层次调用中产生的完整排列。

lst = ['a','b','c','d']
def perm(lst, pfx=[]):
if not lst:
yield pfx
for i in range(len(lst)):
yield from perm( lst[0:i]+lst[i+1:], pfx+[lst[i]] )
print( list(perm(lst)))

最新更新