[英]How to recursively check all combinations of list python
我試圖編寫代碼來遞歸檢查列表是否可以分為兩個具有相同總和的子列表,因此需要傳遞列表的所有組合,例如:[1,2,3,4],因此我需要檢查:
1 ------ 2,3,4
1,2- ------ 3,4
1,3 ------ 2,4
等等。。。但是我找不到該方法。
遞歸檢查一個列表是否可以划分為兩個具有相同總和的子列表
您可以使用遞歸輕松實現貪婪分區算法 :
def _greedy_part(r, sa, la, sb, lb):
if not r:
return sa == sb, la, lb;
if sb < sa:
# swap both lists in order to always have
# the "lower sum list" as sa/la
sb, sa = sa, sb
lb, la = la, lb
return _greedy_part(r[1:], sa+r[0], la+r[0:1], sb, lb)
def greedy_part(r):
return _greedy_part(sorted(r,reverse=True), 0, [], 0, [])
關鍵思想是始終將最大的剩余值添加到具有最低總和的列表中。 再一次,該解決方案在Python中的效果不佳,因為函數調用效率不高,Python沒有尾部調用優化功能 。
給定樣本測試:
print(greedy_part([1,2,3,4]))
print(greedy_part([1,2,3,4,5]))
print(greedy_part([6,1,2,3]))
它將產生:
(True, [4, 1], [3, 2])
(False, [5, 2, 1], [4, 3])
(True, [3, 2, 1], [6])
蠻力:
import itertools
seq = [1, 2, 3, 4]
S = sum(seq)
for i in xrange(1, len(seq)):
for c in itertools.combinations(seq, i):
print c, 2*sum(c) == S
但是,這不是解決問題的最有效方法。 閱讀此: http : //en.wikipedia.org/wiki/Partition_problem
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.