【发布时间】:2016-10-05 23:46:40
【问题描述】:
我正在试验递归函数。我的目标是制作:
一个函数
combo,它生成所有加起来为n的非递增序列
一些示例输入/输出:
>>> print (combo(3))
[[3], [2, 1], [1, 1, 1]]
>>> print (combo(4))
[[4], [3, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1]]
>>> print (combo(5))
[[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]
经过大量试验和错误,我想出了以下功能,它完全符合我的要求:
def combo(n, limit=None):
if not limit:
limit = n
# return [ LIST COMPREHENSION HERE ]
res = []
for i in range(limit, 0, -1):
if i == n:
res.append([i])
else:
res.extend([i] + x for x in combo(n - i, min(n - i, i)))
return res
我的问题:有没有办法(pythonic 与否)使用单个列表理解返回相同的结果,而不附加和扩展res?
以下是我尝试过的两件事,以及它们的错误结果:
return [[i] if i == n else [[i] + x for x in combo(n - i, min(n - i, i))] for i in range(limit, 0, -1)]
# lists get deeper: [[4], [[3, 1]], [[2, 2], [2, [1, 1]]], [[1, [1, [1, 1]]]]]
return [[i if i == n else ([i] + x for x in combo(n - i, min(n - i, i))) for i in range(limit, 0, -1)]]
# parentheses interpreted as generator: [[4, <generator object combo.<locals>.<listcomp>.<genexpr> at 0x01D84E40>, etc.]]
我意识到答案可能很丑陋,但我已经花了足够的时间尝试,我只是想知道它是否可能。
【问题讨论】:
标签: python recursion list-comprehension