Python:如何计算给定数字的部分组合,给出数字,列表长度,第一个和最后一个数字
Python: How to calculate combinations of parts of a given number, giving the number, list lenght, first and last number
我对此非常困惑(可能是因为我是计算机编程的新手)。
我有以下代码,来自问题:[
def sum_to_n(n, size, limit=None):
"""Produce all lists of `size` positive integers in decreasing order
that add up to `n`."""
if size == 1:
yield [n]
return
if limit is None:
limit = n
start = (n + size - 1) // size
stop = min(limit, n - size + 1) + 1
for i in range(start, stop):
for tail in sum_to_n(n - i, size - 1, i):
yield [i] + tail
for partition in sum_to_n(8, 3):
print (partition)
[6, 1, 1]
[5, 2, 1]
[4, 3, 1]
[4, 2, 2]
[3, 3, 2]
它是否很有用,但我正在尝试修改它以设置一些选项。假设我只想得到列表的第一个数字是 4 而列表的最后一个数字是 1 的结果。
目前我使用这个解决方案:
def sum_to_n(n,first, last, size, limit=None):
if size == 1:
yield [n]
return
if limit is None:
limit = n
start = (n + size - 1) // size
stop = min(limit, n - size + 1) + 1
for i in range(start, stop):
if i <=first:
for tail in sum_to_n(n - i,first,last, size - 1, i):
ll=len(tail)
if tail[ll-1]==last:
yield [i] + tail
for i in sum_to_n(8,4,1,3):
if i[0]==4 and i[size-1]==1:
print(i)
if i[0]>4:
break
[4,3,1]
但是对于较大的整数,程序会做很多不需要的工作。
例如,for i in range(start, stop):
计算列表中所有可能的第一个数字,而不仅仅是 "first" 参数 nedded 并且函数没有它就无法工作。
有人可以建议一个更好更快的解决方案来调用提供所需参数的函数,以便仅进行请求的计算?
既然你知道第一个数,你只需要解决最后一个数。
在你的例子中,这会给出类似的东西:
for res in sum_to_n(n=8-4, last=1, size=3-1):
print([4] + res)
我对此非常困惑(可能是因为我是计算机编程的新手)。
我有以下代码,来自问题:[
def sum_to_n(n, size, limit=None):
"""Produce all lists of `size` positive integers in decreasing order
that add up to `n`."""
if size == 1:
yield [n]
return
if limit is None:
limit = n
start = (n + size - 1) // size
stop = min(limit, n - size + 1) + 1
for i in range(start, stop):
for tail in sum_to_n(n - i, size - 1, i):
yield [i] + tail
for partition in sum_to_n(8, 3):
print (partition)
[6, 1, 1]
[5, 2, 1]
[4, 3, 1]
[4, 2, 2]
[3, 3, 2]
它是否很有用,但我正在尝试修改它以设置一些选项。假设我只想得到列表的第一个数字是 4 而列表的最后一个数字是 1 的结果。 目前我使用这个解决方案:
def sum_to_n(n,first, last, size, limit=None):
if size == 1:
yield [n]
return
if limit is None:
limit = n
start = (n + size - 1) // size
stop = min(limit, n - size + 1) + 1
for i in range(start, stop):
if i <=first:
for tail in sum_to_n(n - i,first,last, size - 1, i):
ll=len(tail)
if tail[ll-1]==last:
yield [i] + tail
for i in sum_to_n(8,4,1,3):
if i[0]==4 and i[size-1]==1:
print(i)
if i[0]>4:
break
[4,3,1]
但是对于较大的整数,程序会做很多不需要的工作。
例如,for i in range(start, stop):
计算列表中所有可能的第一个数字,而不仅仅是 "first" 参数 nedded 并且函数没有它就无法工作。
有人可以建议一个更好更快的解决方案来调用提供所需参数的函数,以便仅进行请求的计算?
既然你知道第一个数,你只需要解决最后一个数。
在你的例子中,这会给出类似的东西:
for res in sum_to_n(n=8-4, last=1, size=3-1):
print([4] + res)