我目前停留在有关列表和制定代码的问题上。我必须 例如,如果list = [4,6]我将不得不返回2.(4 + 6)和(6 + 4)。此代码必须适用于任何长度的列表,并且列表中没有两个数字相同。我是新的列表,并坚持如何开始编码。
def countsum(list):
非常感谢帮助
答案 0 :(得分:0)
def count_list_aux(num_possibilities, a_list, i, j):
if i == j: # Only 1 item to check now.
if a_list[i] == 10: # The item itself is 10 so that can be a combo.
return num_possibilities + 1
else: # Otherwise we are done.
return num_possibilities
else:
combo = a_list[i] + a_list[j]
if combo == 10: # (4,6) for instance.
return count_list_aux(num_possibilities+2, a_list, i+1, j-1)
elif combo > 10: # (4,8) for instance. Clearly 8 needs to go when we have a sorted list.
return count_list_aux(num_possibilities, a_list, i, j-1)
else: # (4,7) for instance. Clearly 4 needs to go when we have a sorted list.
return count_list_aux(num_possibilities, a_list, i+1, j)
def countsum(a_list):
a_list = sorted(a_list)
return count_list_aux(0, a_list, 0, len(a_list)-1)
print(countsum([4,6,3,7,5,2,8]))
我已经制作了一个递归解决方案,我只是对列表进行排序(升序),然后以递归方式将最左侧(i
)和最右侧(j
)相加,并检查它们是否相加10.如果他们这样做,那么我将num_possibiltiies
增加2(例如,6,4和4,6是2个组合)。如果总和大于10,那么我将j
递减1,因为很明显,当前索引j
不能与列表中的任何其他值一起使用(列表已排序)。类似地,如果总和小于10,我将i
递增1,因为当前索引i
不能与任何其他值一起使用以获得10的总和(它失败并且索引处的最大值为{ {1}})。
答案 1 :(得分:0)
该功能也可以使用以下方式实现:
from itertools import combinations
from math import factorial
def countsum(L):
x = 10
n = 2
return sum(factorial(n) for c in combinations(L, n) if sum(c) == x)
因子是因为组合产生的元组是项目集,而不是计算每个排列,只需计算它们的计数。因为阶乘依赖于常数,所以可以悬挂它:
def countsum(L):
x = 10
n = 2
return factorial(n) * sum(1 for c in combinations(L, n) if sum(c) == x)