2016-09-29 5 views
0

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'])) 
+3

"* aber es ist etwas falsch in it *" <- bitte erarbeiten –

+3

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) –

+0

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)" –

Antwort

1

Ihre Implementierung ist unnötig ausführlich und repetitiven: Es gibt keine Notwendigkeit, um den Index zu übergeben ist, zum Beispiel, wenn Sie nur auf die nächste Funktion, um den relevanten Teil des Wortes passieren können. Hier ist eine schnelle Umsetzung warf ich zusammen, dass sollte es beheben:

def S(chars): 
    word = ''.join(chars) 
    try: 
    return word[:2] == 'ab' and K(word[2:]) 
    except IndexError: 
    return False 

def K(word): 
    return word == 'x' or (word[0] == 'x' and K(word[1:])) or H(word) 

def H(word): 
    return word in ['c', 'd'] 

Mit dieser Funktion erhalte ich:

>>> list(map(S, ['abx', 'abxxx', 'abc', 'abxd', 'abxc'])) 
[True, True, True, True, True] 
+0

Die OP-Funktionen sind in der Lage, eine Liste von Zeichen als eine Eingabe zu behandeln, wo Ihre Implementierung nur funktionieren würde, wenn die Zeichenfolge als Ganzes übergeben würde. Während ich denke, dass die Verwendung einer Zeichenfolge sinnvoller ist - es würde nicht funktionieren, wie das OP es derzeit verwendet. –

+0

@brianpck Ihr Code ist einfach hervorragend. Herzlichen Glückwunsch dafür. Ich habe es auch verstanden und in einigen Tests, die ich gemacht habe, funktioniert es –