2017-03-24 2 views
1

Ich frage mich, ob es einen Standard Weg oder eine bessere Möglichkeit gibt, gegen unendliche Rekursion als in meinem Code unten zu kontrollieren? Ich möchte, dass meine rekursive Funktion nach max. Versuchen aufgibt. Der folgende Code führt dies durch, indem der Parameter method method eingeführt und während des rekursiven Aufrufs inkrementiert wird. Gibt es einen besseren Weg?Bessere Möglichkeiten zur Kontrolle gegen unendliche Rekursion

def Rec(attempt=0): 
    if attempt==10: 
     return() 
    else: 
     print(attempt) 
     Rec(attempt=attempt+1) 

Rec() 
+4

Was meinst du ** 'besser' **? –

+0

Sie können alle vorherigen Parameter speichern. Wenn Sie denselben Parameter wie bei einem früheren Aufruf erhalten, wissen Sie, dass Sie in eine Schleife geraten sind. – Barmar

+0

@Barmar, das funktioniert nur, wenn Ihre Funktion eine "reine" Funktion ist ;-) – thebjorn

Antwort

0

Ihre ist schon gut. Das ist der Weg zu gehen. Es ist gut, weil es leicht ist. Sie brauchen im Grunde eine int und eine Bedingung Zweig - das ist es.

Alternativ können Sie versuchen, die Schleife in der Bedingung ohne einen Zähler zu brechen (aber das ist normalerweise von Fall zu Fall abhängig).

3

Es gibt auch diese Art und Weise aber wird nicht empfohlen, für das, was Sie tun wollen - ich habe es nur als Referenz geschrieben und ist gut in anderen Fällen zu verwenden ...

#!/usr/bin/env python 

import sys 
sys.setrecursionlimit(5) 

def Rec(attempt=0): 
    print attempt 
    Rec(attempt=attempt+1) 

try: 
    Rec() 
except RuntimeError: 
    print 'maximum recursion depth exceeded' 

Von sys.setrecursionlimit(limit) zu sein noch deutlicher, wie in Python docs gesagt, was sys.setrecursionlimit(limit) tut, ist:

die maximale Tiefe des Interpreters Stapel Python Set zu begrenzen. Dieses Limit verhindert, dass die unendliche Rekursion einen Überlauf des C Stacks verursacht und Python zum Absturz bringt.

Die höchstmögliche Grenze ist plattformabhängig. Ein Benutzer muss möglicherweise das Limit höher setzen, wenn sie ein Programm hat, das eine tiefe Rekursion und eine Plattform erfordert, die ein höheres Limit unterstützt. Dies sollte mit Vorsicht erfolgen, da ein zu hohes Limit zu einem Absturz führen kann.

Also meiner Meinung nach ist zu Chaos mit dem Python-Interpreter Stapel nicht gut, wenn Sie sehr gut wissen, was Sie tun.

+0

Wenn Sie dies tun, wissen Sie, dass es für den gesamten Interpreter gilt. Stellen Sie sicher, dass Sie es zurückstellen, wenn Sie keine anderen Anrufe tätigen möchten. – TemporalWolf

+0

Ja, das habe ich mir gedacht. :) –

3

Sie könnten einen Dekorateur machen, und dann können Sie Ihre richtige rekursive Funktion, mit seinen üblichen Austrittsbedingungen schreiben, sondern auch eine Rekursion Grenze zu verhängen:

def limit_recursion(limit): 
    def inner(func): 
     func.count = 0 
     def wrapper(*args, **kwargs): 
      func.count += 1 
      if func.count < limit: 
       result = func(*args, **kwargs) 
      else: 
       result = None 
      func.count -= 1 
      return result 
     return wrapper 
    return inner 

Code wäre (mit einer Grenze von 3):

@limit_recursion(limit=3) 
def Rec(): 
    print('hi') 
    Rec() 

Running:

>>> Rec() 
hi 
hi 
hi 
+0

Hinweis: Ich bin mir nicht sicher, wie dies in einer Multithread-Umgebung funktionieren würde. Ich stelle mir vor, dass es nicht wie geplant funktionieren würde (c: –

Verwandte Themen