Ich arbeite Q3 in Diskussion 6 von UCB CS61A. Es fordert uns auf, einen rekursiven Baumgenerator zu implementieren. Die Antwort lautet wie folgt: < /p>
Code: Select all
def partition_gen(n, m):
"""Yield the partitions of n using parts up to size m.
>>> for partition in sorted(partition_gen(6, 4)):
... print(partition)
1 + 1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 2
1 + 1 + 1 + 3
1 + 1 + 2 + 2
1 + 1 + 4
1 + 2 + 3
2 + 2 + 2
2 + 4
3 + 3
"""
if n == m:
yield str(n)
if n - m > 0:
for p in partition_gen(n - m, m):
yield p + ' + ' + str(m)
if m > 1:
yield from partition_gen(n, m-1)
Jemand versucht das a = partition_gen (6,4) und ruft drei nächste (a) "2+4", "1+1+4" und "3+3" ab. Es wäre hilfreich, wenn mir jemand den logischen Fluss dahinter erklären könnte. Eine Abfolge von rekursiven Aufrufen partiton_gen (2,4), partition_gen (2,3), partition_gen (2,2) wird hergestellt und erreicht schließlich einen Basisfall n = m . Hier muss nichts erklärt werden. Das Programm sollte dort starten, wo es das letzte Mal stoppt, und erneut eine Abfolge von rekursiven Aufrufen vornehmen: partition_gen (2,4), partition_gen (2,3), partition_gen (2,2) . Nach meinem Verständnis ist partition_gen (2,2) ein neuer Anruf und sollte einen neuen Generator generieren. Somit sollte das Programm hier wieder ein "2" ergeben. Aus irgendeinem Grund verhält sich das Programm so, als wäre dies nur ein weiterer Aufruf für denselben Generator und gibt "1+1" zurück. Wenn wir jedoch alles auf diese Weise interpretieren, warum in der dritten nächsten (a) dann, wenn partition_gen (2,2) erneut aufgerufen wird, kein Stopitation Fehler auftritt? Um eine rekursive Funktion zu entwerfen, könnte ich uns wünschen, dass die Funktion das, was ich für ein
Problem mit kleinerer Größe möchte, zurückgibt, und sicherstellen, dass mein Programm das richtige für ein größeres
Problem zurückgibt. Für einen rekursiven Generator scheint es jedoch, dass ich viele zusätzliche Anstrengungen benötigt, um jeden rekursiven Anruf sorgfältig zu verfolgen und zu überwachen, was für jeden Anruf Ausbeute wäre. Ich denke, diese zusätzliche Anstrengung kann vermieden werden. < /P>
Ich glaube, diese Frage muss für viele von Ihnen einfach sein. Angesichts der Tatsache, dass ich in CS relativ neu bin, bitte, mich mit mir zu versorgen und Hilfe zu leisten.