如果我可以从列表或数字子列表中创建总和,如何递归检查?
[23, 40, 20, 6, 3, 12, 20, 21, 18, 17]
我可以从列表[40,6,18]
创建64,但我无法从任何子列表创建34。
答案 0 :(得分:2)
确定您是否可以从数字列表或子列表中创建总和:
1)从第一个数字开始。
2)如果这个数字等于你想要创造的总数,那就停下来,你已经成功了。
3)如果该数字大于您尝试创建的数字,请跳至下一个数字并转到步骤2.
4)从您要查找的总和中减去该数字。
5)重复此算法,尝试使用剩余的数字(在此之后的数字)找到剩余的总和。
6)转到下一个号码。如果没有,请停止。
7)转到第2步。
因此,例如,如果你试图从[1,13,17,8]中找到55的总和,你可以将其减少到这三个问题:
你能从[13,17,8]中找到55-1的总和吗? (这将找到包含第一个数字的任何解决方案。)
你能从[17,8]中找到55-13的总和吗? (这将找到任何不包括第一个数字但包含第二个数字的解决方案。)
你能从[8]中找到55-17的总和吗? (这将找到任何不包括第一个或第二个数字但包括第三个数字的解决方案。)
8是解决方案吗? (这将找到任何不包括前三个数字但包括第四个数字的解决方案。)
请注意,每个新问题的条款少于原始问题。所以它不会永远持续下去。
答案 1 :(得分:1)
如果这是作业,那么提供非递归的解决方案对你没有帮助。如果它不是作业,那么不要强迫自己使用递归...而是使用itertools:
>>> lst =[23, 40, 20, 6, 3, 12, 20, 21, 18, 17]
>>> from itertools import chain,combinations
>>>
>>> def powerset(iterable):
... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
... s = list(iterable)
... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
...
>>> next(x for x in powerset(lst) if sum(x) == 64)
(23, 20, 21)