在递归函数中获取生成器的结果
Getting results for a generator inside recursive function
我试图从 itertools.permutations()
复制函数,纯粹是出于教学原因。
一种方法是使用 1 列表,其中 0 表示给定元素已被使用。
例如,字母列表:
list_l = ['a','b','c']
和列表 [0,1,1]
表示 a
已经被使用。
我将这个列表传递给相同的函数,它生成子列表 [0,0,1]
和 [0,1,0]
对应于被选中的字母 b 和 c 通过消除第一个列表和 c 然后 b 为第二个
这种在列表位置标记字母的方法,需要我为组合的每个位置保留一个历史记录,所以即使我得到正确的结果,我也想让函数成为一个生成器,给出一个结果一次,但我不知道如何在不破坏递归性并因此破坏程序的情况下做到这一点。我需要 return 来保持历史记录干净,以便生成下一个元素,我怀疑是否可以并行使用 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)
这是进行排列的递归方法。这里的理论是,对于列表中的每个元素,您生成该元素加上列表中其他元素的排列。最终,您会到达一个没有更多选项可供排列的位置,此时您可以完成 return 的排列。 “yield from”是一种传递,只是传递从更深层次的调用中产生的完整排列。
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)))
我试图从 itertools.permutations()
复制函数,纯粹是出于教学原因。
一种方法是使用 1 列表,其中 0 表示给定元素已被使用。
例如,字母列表:
list_l = ['a','b','c']
和列表 [0,1,1]
表示 a
已经被使用。
我将这个列表传递给相同的函数,它生成子列表 [0,0,1]
和 [0,1,0]
对应于被选中的字母 b 和 c 通过消除第一个列表和 c 然后 b 为第二个
这种在列表位置标记字母的方法,需要我为组合的每个位置保留一个历史记录,所以即使我得到正确的结果,我也想让函数成为一个生成器,给出一个结果一次,但我不知道如何在不破坏递归性并因此破坏程序的情况下做到这一点。我需要 return 来保持历史记录干净,以便生成下一个元素,我怀疑是否可以并行使用 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)
这是进行排列的递归方法。这里的理论是,对于列表中的每个元素,您生成该元素加上列表中其他元素的排列。最终,您会到达一个没有更多选项可供排列的位置,此时您可以完成 return 的排列。 “yield from”是一种传递,只是传递从更深层次的调用中产生的完整排列。
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)))