Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Iterations- und Rekursionsmethoden in Python

Detaillierte Erläuterung der Iterations- und Rekursionsmethoden in Python

高洛峰
高洛峰Original
2017-03-17 17:11:181720Durchsuche

Wenn eine Situation auftritt, ist es notwendig, eine rekursive Operation durchzuführen, aber die Anzahl der Rekursionen ist sehr groß, mehr als 10.000 Mal. Reden wir nicht über mehr als 10.000 Rekursionen. Der ursprüngliche Testcode ist in Java. Ohne JDK und Kompilierungsumgebung verwenden wir Python

Schauen wir uns zuerst den ursprünglichen Java-Code an:

public class UpCount {
    private long calc(int depth) {
        if (depth == 0) return 1;
        long cc = calc(depth - 1);
        return cc + (depth % 7) + ((((cc ^ depth) % 4) == 0) ? 1 : 0); 
    }
    public static void main(String[] args) {
        UpCount uc = new UpCount();
        System.out.println(uc.calc(11589));
    }
}

Ich habe nicht viel Java gespielt, aber diese Codezeilen sind immer noch nicht stressig. Ich habe das Durcheinander schnell beseitigt und es in Python-Code geändert

def calc(depth):
    if depth == 0:
        return 1
    cc = long(calc(depth-1))
    xor_mod = (cc ^ depth)%4
    if xor_mod == 0:
        return cc+(depth%7)+1
    else:
        return cc+(depth%7)
 
number = long(calc(11589))
print number

Stick Der Code, F5, etwas ist schief gelaufen

Diese Version des Codes fügte ursprünglich nicht lange hinzu, da die vorherige Zeichenfolge mit mehr als zehn Ziffern Ganzzahlen direkt verwendet werden kann, also Ich vermute, dass es mit long zusammenhängt.

Natürlich hat es nichts mit long zu tun. Die von Python unterstützte Ganzzahllänge ist sehr lang 🎜>

cimal = 7
original = 28679718602997181072337614380936720482949
array = ""
result= ""
while original !=0:
    remainder = original % cimal
    array += str(remainder)
    original /= cimal
length = len(array)
for i in xrange(0,length):
    result += array[length-1-i]
print result
Der obige Code konvertiert eine lange Folge von Dezimalzahlen in eine hexadezimale Darstellung oder in ein beliebiges Hexadezimalsystem. Verwenden Sie dazu einfach oct() und hex() Division. Lass es uns lösen


Daher ist ersichtlich, dass der Fehler nicht in der Größe der Zahl liegt. Schließlich ist 11589 für heutige Computer nur ein Kinderspiel und 65536

Tatsächlich wurde mir erst dann klar, dass der wahre Grund für den vorherigen rekursiven Fehler nicht erwähnt wurde.

Der Grund für den rekursiven Fehler ist, dass die Standard-Rekursionsgrenze von Python ist nur etwa 1.000 Mal verfügbar, aber hier muss es mehr als 10.000 Mal ausgeführt werden, und ich habe lange zum Aktualisieren gebraucht: Ausführungszeit

Fehler: maximale Rekursionstiefe überschrittenAlso schnell Ich habe es überprüft und festgestellt, dass ich die maximale Anzahl von Rekursionen in Python selbst festlegen kann. Als Erweiterung können Sie auch die offizielle Website-Dokumentation überprüfen

Im Allgemeinen, um Vorteile und Abstürze zu vermeiden , die Python-Sprache fügt standardmäßig eine Begrenzung der Anzahl hinzu. Wenn ich diese Begrenzung also ändere, ist das dann in Ordnung?

import sys

#

set

the maximale Tiefe als 20000sys.setrecursionlimit(20000)

Fügen Sie den obigen Code ein und ändern Sie ihn entschieden auf 20000, aber das Ergebnis war schockierend. Ich war verwirrt

und habe nicht weiter nachgeschaut. Ich habe meinen Freund Littlehann gefragt und darüber gesprochen, mich aber nicht weiter mit diesem Thema befasst. Aber wenn es um die Effizienz rekursiver Operationen in praktischen Anwendungen geht, ist die Verwendung von Rekursionen in der Tat selten, außer in Lehrbüchern. Ich bin zwar nicht sehr beeindruckt, aber eine

for-Anweisung

kann erledigt sein.

Der Code lautet wie folgt:

Nur ​​ein paar Zeilen Code, alles auf einmal hat es geschafft. Als ich an das letzte Interview dachte, fragte mich der TX-Interviewer nach dem Algorithmus. Damals erwähnte er die Verwendung von Rekursion, um eine Operation zu implementieren.

def calc(depth):
    tmp = 0
    result = 1
    
    for i in xrange(0,depth+1):
        cc = result
        if (cc ^ i)%4 == 0:
            tmp = 1
        else:
            tmp = 0
        result = result + (i)%7 + tmp
        
    return result
final = calc(11589)
print final
Es ist lange her und ich kann mich damals nicht mehr genau an die Frage erinnern, aber die heutige Lektion lautet: In den meisten Fällen (weniger Code geschrieben, Schätzung basierend auf Gefühl) rekursiv Die Effizienz ist relativ niedrig. Das wurde auch im Unterricht erwähnt


. Die Effizienz der Iteration ist offensichtlich höher als die der Rekursion (ich kann mich nicht genau an das spezifische Konzept der Iteration erinnern). Ich bin sicher, dass es bei Hunderttausenden kein Problem geben wird von Operationen, aber selbst wenn ich das Rekursionslimit ändere, ist immer noch ein Strike aufgetreten

Schließlich wird ein weiterer Link zu Python Long VS C Long Long gepostet. Wenn Sie interessiert sind, können Sie ihn sich ansehen

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Iterations- und Rekursionsmethoden in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn