2016-11-18 9 views
0

So habe ich diese Funktion (Beispiel):Wie man Wiederholungen einer rekursiven Funktion zählt?

def monty(x): 
    if abs(int(x)) == 1: 
    print("Cool!") 
    print("Took %s attempts.") % (z) 
    elif abs(int(x)) == 0: 
    print("Nope.") 
    else: 
    z = z + 1 
    y = x - 1 
    monty(y) 

Nun, natürlich, ‚z‘ ist noch nicht definiert worden, so dass, wenn diese Funktion so ausgeführt wird, dass die ‚else‘ Anweisung aufgerufen wird, wird das Programm Gibt eine NameError-Ausnahme zurück.

Nun, ok. Lassen Sie uns versuchen, die Aussage dieses machen:

else: 
    try: z 
    except NameError: z = 0 
    else: z = z + 1 
    y = x - 1 
    monty(y) 

Auch übernehmen wir die gleiche Nameerror Fang an die ‚if‘ Anweisung hinzugefügt.

Die Anweisung gibt immer 'z' als 0 zurück, da die Variable vollständig vergessen wird, wenn 'monty' erneut ausgeführt wird. Ok, was ist, wenn wir zuerst versuchen, z außerhalb von 'monty' zu definieren und den NameError catch zu löschen?

Nun, gibt sie einen Nameerror wieder, und wenn wir stattdessen den Nameerror Fang halten, ist es nur noch immer gibt 0.

So wie kann ich die Funktion Erhöhung z jedes Mal machen es gültig heißt? Mit anderen Worten, Wie kann ich das Programm stillschweigend zählen lassen, wie oft eine Funktion ausgeführt wurde, um später wieder aufgerufen zu werden? Lassen Sie uns versuchen, aus Gründen der Benutzerfreundlichkeit vermeiden, ein weiteres Argument der Funktion hinzuzufügen.

+0

'print (" Tuck% s Versuche. ")% (Z)' wird nicht tun, was Sie denken, dass es tut. '%' ist ein Operator in einer Zeichenfolge. Es muss in die Klammer gehen: 'print (" Versuche% s Versuche. "% Z)' –

+0

@PatrickHaugh: Bei Python 2 funktioniert das immer noch, weil 'print' eine Anweisung ist und diese Klammern um die Zeichenkette ein Nein sind -op. Aber in Python 3 hättest du recht. –

+0

@MartijnPieters guten Punkt. Ich sah den eingeklammerten 'Print' und nahm an. –

Antwort

2

Fügen Sie einfach z als Stichwort Argument:

def monty(x, _z=0): 
    # ... 
    else: 
     _z = _z + 1 
     y = x - 1 
     monty(y, _z) 

I z zu _z umbenannt, um anzuzeigen, dass es ein Implementierungsdetail ist der Endbenutzer nicht zu kümmern braucht. Da Schlüsselwortargumente eine Standardeinstellung haben, muss sich der Aufrufer von monty() nicht darum kümmern.

+0

Hm. Das ist ein cleverer kleiner Hack dort. Warum habe ich nicht daran gedacht? – Papayaman1000

Verwandte Themen