2016-08-12 25 views
0

我非常堅持這一點(可能是因爲我是計算機編程的新手)。 我有以下的代碼,從問題:Python: Find all possible combinations of parts of a given numberPython:如何計算給定數字的部分組合,給出數字,列表長度,第一個和最後一個數字

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):計算列表中所有可能的第一個數字,而不僅僅是「第一個」參數被定義,並且該功能在沒有它的情況下不起作用。 有人可以建議一個更好更快的解決方案來調用給出所需參數的函數,以便只有請求的計算?

+0

,我得到了相同的列表,但以相反的順序。你真的得到你展示的訂單嗎? –

+0

不,它只是例如,不是實際輸出 –

回答

1

既然你知道第一個數字,你只需要解決,如果是最後一個。

在你的榜樣,即會看到這樣的:當我在Python 3.5.2運行你的第一個代碼

for res in sum_to_n(n=8-4, last=1, size=3-1): 
    print([4] + res) 
+0

是有趣和鼓舞人心的。最後我找到了一個使用你的想法的方法我從總數「n」中減去了第一個和最後一個數字,並且僅爲「中間」數字調用了函數。然後簡單地加入三個部分:第一,水庫,最後。這樣更快。 –

相關問題