2016-08-12 2 views
0

Ich bin sehr fest auf diesem (wahrscheinlich, weil ich neu in der Computerprogrammierung bin). ich den folgenden Code haben, von der Frage: [Python: Find all possible combinations of parts of a given numberPython: Wie man Kombinationen von Teilen einer gegebenen Zahl berechnet, die Nummer, die Listenlänge, die erste und die letzte Nummer gibt

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] 

ist es sehr nützlich, aber ich versuche, es zu ändern, um einige Optionen einzustellen. Angenommen, ich die erste Nummer der Liste nur die Ergebnisse in Wich haben will, ist 4 und die letzte der Liste ist 1. Im Moment benutze ich diese Lösung:

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] 

Aber mit größeren Zahlen sind das Programm viel unerwünschte Arbeit machen. Zum Beispiel berechnet die for i in range(start, stop): alle möglichen ersten Nummern der Liste und nicht nur den "ersten" Parameter vermeintlich und die Funktion funktioniert nicht ohne sie. Jemand kann eine bessere und schnellere Lösung vorschlagen, um die Funktion aufzurufen, die die Parameter enthält, die benötigt werden, um nur die angeforderten Berechnungen zu haben?

+0

Wenn ich Ihren ersten Code in Python ausführen 3.5.2, erhalte ich die gleichen Listen, aber in umgekehrter Reihenfolge. Erhalten Sie tatsächlich die Bestellung, die Sie zeigen? –

+0

nein es ist nur zum Beispiel, ist nicht die tatsächliche Ausgabe –

Antwort

1

Da Sie die erste Nummer kennen, müssen Sie nur, wenn für die letzte zu lösen.

In Ihrem Beispiel, dass so etwas geben würde:

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

Ja interessant und inspirierend. Endlich habe ich mit deiner Idee einen Weg gefunden. Ich subtrahierte von der Summe "n" die erste und die letzte Nummer und rief die Funktion nur für die "dazwischen" -Zahlen auf. Dann verbinden Sie einfach die drei Teile: zuerst, res, last. Auf diese Weise ist schneller. –

Verwandte Themen