Ich versuche, einen Code, um eine Kette von Zeichen nach den Grammatikregeln zu erkennen:Python-Code zu übernehmen vordefinierte Grammatik
- S-> ABK
- K-> x | xK | H
- H-> c | d
So dass Wörter wie abx, abxxx, abc, abxd, abxc, etc ... werden alle angenommen und Worte wie ab, abb, xxx, etc ... werden nicht akzeptiert.
Ich schrieb einen Code, um das zu tun und in meiner Analyse sollte es den Trick tun, aber es ist etwas falsch darin, dh es gibt Falsch für abxx, ein Satz, der von der Grammatik akzeptiert werden sollte und ich denke es hat mit verschachtelten Rückgabewerten von Funktionen zu tun, die ich nicht gut verstehe.
Der Code wird unten eingefügt, wenn Sie mich herausfinden oder zeigen, was ich falsch mache, werde ich dankbar sein.
def S(word):
if word[0] == 'a':
atual = 1
else:
return False
if word[1] == 'b':
atual = 2
else:
return False
accepted = K(atual, word)
if accepted == True:
return True
else:
return False
def K(atual, word):
if word[atual] == 'x':
atual += 1
if len(word) <= atual: # checks to see if the word ended and accept by the first rule of the set K.
return True
else:
K(atual, word) # keeps increasing the value of atual, satisfying the rule xK
else:
value = H(atual, word) # if no more 'x' are found, try the rule H
return value
def H(atual, word):
if word[atual] == 'c' or word[atual] == 'd':
return True
else:
return False
print(S(['a','b','x','x']))
"* aber es ist etwas falsch in it *" <- bitte erarbeiten –
Ich bemerke, dass Sie eine Zeile haben, die nur 'K (atual, word)' ist, das führt die Funktion aus, aber tut nichts mit dem Rückgabewert und gibt dann None zurück, ich nehme an, dass dies das Problem ist, aber ohne Ausarbeitung nicht sicher sein kann . Ich würde auch empfehlen, es durchzugehen [Schritt für Schritt in einem Visualizer] (http://www.pythontutor.com/visualize.html#mode=edit) –
danke @ TadhgMcDonald-Jensen Ich fand heraus, was falsch war, und es ist die Linie, auf die Sie wiesen, ich musste einfach schreiben "return K (atual, word)" –