【发布时间】:2020-05-31 20:07:44
【问题描述】:
好的,所以我有以下简单的 Python 3 函数,它完全可以做它应该做的事情:
def comb(a):
if len(a)==0:
return[[]]
else:
p=[]
for c in comb(a[1:]):
p+=[c,c+a[:1]]
return p
正确产生
>>> comb([1,2,3])
[[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]]
出于更好地理解递归函数的愿望,我试图看看是否可以将这个简单的函数转换为 lambda。我尝试的第一件事是各种版本:
comb=lambda a:[[]]if len(a)==0 else[[c,c+a[:1]]for c in comb(a[1:])]
显然,这不起作用。然后我退后一步,只是尝试更改原始函数的语法,例如:
def comb(a):
return[[]]if len(a)==0 else[p for p in[[c,c+a[:1]]for c in comb(a[1:])]]
这也不起作用,就像根本一样。我尝试了各种不同的安排,但无济于事。显然,原始函数是最有用且最容易阅读的,我只是询问这个以更好地理解我自己的 python。当不涉及递归时,我通常很擅长这个游戏,所以我只是想了解我在这里缺少什么。
【问题讨论】:
-
您的问题的目标是什么?使用
lambda编写函数?使用列表推导编写函数?请注意,lambda表达式通常不适合递归,因为递归本质上依赖于 按名称 调用函数——lambda的重点是创建未命名的函数。您可以将lambda分配给一个名称,但这违背了目的。 -
+=就像 list.extend(),它会扁平化你的列表,不像你的列表组合 -
@MisterMiyagi 根据我最初的问题,目标只是增加我自己对递归函数和列表理解的理解。
标签: python python-3.x lambda combinations permutation