2012-04-06 11 views
-5
def partitions(n): 
    # base case of recursion: zero is the sum of the empty list 
    if n == 0: 
     yield [] 
     return 

    # modify partitions of n-1 to form partitions of n 
    for p in partitions(n-1): 
     yield [1] + p 
     if p and (len(p) < 2 or p[1] > p[0]): 
      yield [p[0] + 1] + p[1:] 

Erläuterung: Wenn Sie eine Partition von n haben, können Sie es auf eine Partition von n-1 in kanonischer Weise reduzieren, indem man aus der Subtraktion kleinstes Element in der Partition. Z.B. 1 + 2 + 3 => 2 + 3, 2 + 4 => 1 + 4. Dieser Algorithmus kehrt den Prozess um: Er findet für jede Partition p von n-1 die Partitionen von n, die durch diesen Prozess auf p reduziert werden. Daher wird jede Partition von n in dem Schritt genau einmal ausgegeben, wenn die Partition von n-1, auf die sie reduziert wird, betrachtet wird.Algorithmus Übersetzung PHP oder Pseudo-Code von Python für Partition einer ganzen Zahl

Dies ist ein Code zum Abrufen aller möglichen Partitionen einer Zahl in Python. Ich bin nicht gut in Python. Ich würde es sehr schätzen, wenn jemand es einfach in Pseudocode (oder detaillierte Beschreibung) oder in PHP transformieren könnte. Die obige Erklärung erzeugt einen Zweifel darüber, "einen von dem kleinsten Gegenstand in der Partition zu subtrahieren". Ich kann auch eins vom zweitkleinsten oder einem anderen Element subtrahieren. Also, warum nur am kleinsten? Wenn mir jemand die ganze Idee erklären könnte, wäre es wirklich dankbar. Danke.

+2

Ich glaube nicht, können Sie bringen Sie Leute einfach dazu, Dinge für Sie hier zu programmieren. Sie müssen sich zuerst etwas anstrengen. – jamylak

+0

@jamylak Ich frage nicht nach PHP. Ich habe auch für Pseudocode geschrieben. Ich wollte nur den Code bekommen. Das ist es! Also, was ist es, dass du es als -1 bewertet hast? Wenn ich weniger Ansehen habe, bedeutet das nicht, dass alles, was ich frage oder tue, nutzlos oder albern ist. – Sushant

+0

'Partitionen (n)' gibt/gibt nichts zurück für Werte von 'n' außer' 0' ... – knittl

Antwort

2
def partitions(n): 
    # base case of recursion: zero is the sum of the empty list 
    if n == 0: 
     yield [] # yield empty array 
     return # exit function 

    # modify partitions of n-1 to form partitions of n 
    for p in partitions(n-1): # recursive call, get n-1 partitions 
     yield [1] + p # yield array [1, p...] 
     if p and (len(p) < 2 or p[1] > p[0]): # p not empty, and length < 2 or p[1] > p[0] 
      yield [p[0] + 1] + p[1:] # increment first item of p and yield p 

Hier ist mein Versuch (afaik PHP nicht yield hat, so könnte es schlimmer ausführen):

function partitions($n) { 
    # base case of recursion: zero is the sum of the empty list 
    if(!$n) return array(array()); # return/"yield" empty array 

    # modify partitions of n-1 to form partitions of n 
    $a = array(); # will hold "yielded" values 
    foreach(partitions($n-1) as $p) { # recursive call 
    $a[] = array_merge(array(1), $p); # "yield" array [1, p...] 
    if($p && (count($p) < 2 || $p[1] > $p[0])) { # p not empty, and length < 2 or p[1] > p[0] 
     ++$p[0]; # increment first item of p 
     $a[] = $p; # "yield" p 
    } 
    } 
    return $a; # return all "yielded" values at once 
} 

(Ich garantiere nichts)

+0

Der Code funktioniert nicht wirklich. Aber ich bin dir wirklich dankbar dafür, dass du das versucht hast. – Sushant

+0

Die Bearbeitung, die getan werden muss, ist das ----> if ($ n == 1) Array (Array (1)) zurückgeben; // Base Case – Sushant

+0

Sie haben ganz Recht, Ausbeute liefert Elemente aus einem Array, so 'yield []' gibt ein leeres Array von einem Array zurück. 'if (! $ n) return array (array())' sollte genauso gut funktionieren und sollte für alle Fälle von 'n> = 0 funktionieren. Ich habe meine Antwort bearbeitet, um dies zu reflektieren. – knittl