Ich verstehe nicht wirklich, wie yield
Anweisung in dieser Situation funktioniert. Das Problem besagt, dass bei einem Ausdruck ohne Klammern eine Funktion zum Generieren aller möglichen vollständig geklammerten (FP) Ausdrücke geschrieben wird. Sprich, der Eingang, der 5 '1+2+3+4'
FP Ausdrücke erzeugt werden soll:Unterschiedliche Ergebnisse von Rendite und Rendite
- (1+ (2+ (3 + 4)))
- (1 + ((2 + 3) +4))
- ((1 + 2) + (3 + 4))
- ((1+ (2 + 3)) + 4)
- (((1 + 2) +3) +4)
Mein Code ist wie folgt.
OPS = ('+', '-', '*', '/')
def f(expr):
"""
Generates FP exprs
Recursive formula: f(expr1[op]expr2) = (f(expr1) [op] f(expr2))
"""
if expr.isdigit(): yield expr
# return [expr]
# ret = []
first = ''
i = 0
while i < len(expr):
if expr[i] not in OPS:
first += expr[i]
i += 1
else:
op = expr[i]
i += 1
second = expr[i:]
firstG, secondG = f(first), f(second)
for e in ('(' + e1 + op + e2 + ')' for e1 in firstG for e2 in secondG):
yield e
# ret.append(e)
first += op
# return ret
Wenn ich return
Aussage (die auf Kommentar Zeilen) verwenden, dann funktioniert der Code wie erwartet. Wenn ich jedoch zu yield
Statement wechsle, wie der Code zeigt, bekomme ich nur die ersten 4 Ergebnisse. Wenn die Anzahl der Operanden des Eingabeausdrucks erhöht wird, gehen natürlich mehr Ergebnisse verloren. Zum Beispiel für die Eingabe '1+2+3+4+5'
, bekomme ich nur 8 statt 14
ich endlich den Weg finden, um den Code Arbeit zu machen, indem die Linie firstG, secondG = f(first), f(second)
kommentieren und ersetzen Sie die Zeile
for e in ('(' + e1 + op + e2 + ')' for e1 in firstG for e2 in secondG):
von
for e in ('(' + e1 + op + e2 + ')' for e1 in f(first) for e2 in f(second)):
, dass einige ‚Informationen‘ des Generators Mittel wegen der Linie verloren firstG, secondG = f(first), f(second)
aber Ich kann den wahren Grund nicht herausfinden. Könnt ihr mir ein paar Ideen geben?
Bitte geben Sie die Frage bearbeiten und die Vertiefung des Programms beheben.In Python-Programmen ist das falsche Einrücken besonders ärgerlich. – avakar
Es tut mir leid, weil ich nicht weiß, wie der Tag-Code hier funktioniert. Ich habe es bereits behoben. Danke – user247468
hat es als Hausaufgabe getaggt, da ich den Eindruck hatte, dass es ist. –