簡體   English   中英

如何遞歸檢查列表python的所有組合

[英]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

您可以使用

  1. Simleo建議的itertools。 這是蠻力解決方案,將在指數時間內運行。

  2. 使用此處給出的傳統子集問題解決方案該解決方案在(total_sum_of_nums)* len(list)時間內運行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM