【发布时间】:2018-03-18 14:03:44
【问题描述】:
这就是我想要做的。给定一个数字和一组数字,我想将该数字划分为集合中给定的数字(重复)。 例如 : 取数字 9,数字集 = {1, 4, 9}。 它将产生以下分区:
{ (1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 4), (1, 4, 4), (9,) }
无法形成使用集合 {1, 4, 9} 的其他可能分区来对数字 9 求和。
我用 Python 写了一个函数来完成这个任务:
S = [ 1, 4, 9, 16 ]
def partition_nr_into_given_set_of_nrs(nr , S):
lst = set()
# Build the base case :
M = [1]*(nr%S[0]) + [S[0]] * (nr //S[0])
if set(M).difference(S) == 0 :
lst.add(M)
else :
for x in S :
for j in range(1, len(M)+1):
for k in range(1, nr//x +1 ) :
if k*x == sum(M[:j]) :
lst.add( tuple(sorted([x]*k + M[j:])) )
return lst
它工作正常,但我想看看关于它的一些意见。我对它使用 3 个循环这一事实不满意,我想它可以以更优雅的方式进行改进。也许递归更适合这种情况。任何建议或更正将不胜感激。提前致谢。
【问题讨论】:
-
16 in
S正确吗? -
是的,因为它会忽略它,因为它大于要分区的数字 9。无论有没有它,该功能都可以正常工作。较大的数字不能成为分区的一部分。
标签: python numbers set partition