【发布时间】:2015-09-02 03:44:10
【问题描述】:
我需要一个接受两个整数的函数,比如说 n 和 m,其中 n >= 0 和 m >= 1,它返回一个列表列表,其中包含将 n 拆分为 m 个正整数部分的所有可能方法(顺序很重要,[4, 7, 2] 与 [7, 4, 2] 不同。)
现在,我能够想出一个快速的小递归函数来完成这项工作,如下所示:
def split(number, elements):
if elements == 1:
return [[number]]
ways = []
for i in range(0, number + 1):
for j in split_number(number - i, elements - 1):
values.append([i] + j)
return values
但是,我可能会使用大量数字,因此需要将其转换为迭代方法。我不确定如何做到这一点,因为它每次“超级调用”都会多次调用自己,这使得甚至难以转换为尾调用和累加器,更不用说使用它们转换为迭代形式了。
示例输出:
split(7, 2) -> [[0, 7], [1, 6], [2, 5], [3, 4], [4, 3], [5, 2], [6, 1], [7, 0]]
split(4, 3) -> [[0, 0, 4], [0, 1, 3], [0, 2, 2], [0, 3, 1], [0, 4, 0], [1, 0, 3],
[1, 1, 2], [1, 2, 1], [1, 3, 0], [2, 0, 2], [2, 1, 1], [2, 2, 0], [3, 0, 1], [3, 1, 0],
[4, 0, 0]]
等等
【问题讨论】:
-
如果它是一个练习,然后尝试实施它。否则,
itertools.permutations可能就是您想要的。 -
@zyxue 这不是excersize,我只需要代码。不过,我看不出
permutations对我有什么帮助。我想不出一个集合,它的所有排列都加到某个数字上。 -
排列可用于生成从combinations_with_replacement 中缺少的元素,这些元素由它产生并且总和为数字。例如,combinations_with_replacement(range(5),3) 生成 (0, 0, 4) 但不生成 (4, 0, 0) 或 (0, 4, 0),它们是它的排列。
-
对,使用
combinations_with_replacement更有意义,请看我的回答。搞定这件事有点棘手。 -
您的标题和问题不匹配 - 是 n into m 还是 m into n?
标签: python algorithm recursion