在对多重嵌套 for 循环使用递归的程序中找不到故障


alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 
'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z']
endlist = []
def loopfunc(n, lis):
if n ==0:
endlist.append(lis[0]+lis[1]+lis[2]+lis[3]+lis[4])

for i in alphabet:
if n >0:
lis.append(i)
loopfunc(n-1, lis )
loopfunc(5, [])

该程序应该使最终列表成为:

endlist = [aaaaa, aaaab, aaaac, ... zzzzy, zzzzz]

但它做到了:

endlist = [aaaaa, aaaaa, aaaaa, ... , aaaaa]

长度是正确的,但它不会产生不同的词。谁能帮我看看为什么?

你唯一添加到endlist的是lis的前 5 个元素,并且由于你有一个在所有递归调用之间共享的lis(请注意,除了endlistlis的初始值之外,您永远不会在此代码中创建新列表,因此每个附加到lis都发生在同一个列表中(, 前 5 个元素始终是您在前 5 个递归调用中附加的a值。 字母表的其余部分位于lis末尾,并且永远不会被任何其他代码访问。

由于您最终想要字符串,因此使用字符串来收集物品会更容易一些。这避免了导致问题共享可变引用的可能性。这样,递归变得非常简洁:

alphabet = 'abcdefghijklmnopqrstuvwxyz'
def loopfunc(n, lis=""):
if n < 1:
return  [lis] 
res = []
for a in alphabet:
res.extend(loopfunc(n-1, lis + a))
return res
l = loopfunc(5)
print(l[0], l[1], l[-1], l[-2])
# aaaaa aaaab zzzzz zzzzy

请注意,当 n=5 时,您将有近 1200 万个组合。如果您计划使用更大的n值,则可能值得将其重写为生成器。

最新更新