Heim >Backend-Entwicklung >Python-Tutorial >Iteration und Rekursion in Python

Iteration und Rekursion in Python

高洛峰
高洛峰Original
2016-10-19 11:56:201278Durchsuche

Wenn eine Situation auftritt, ist eine rekursive Operation erforderlich, aber die Anzahl der Rekursionen ist sehr groß und beträgt mehr als 10.000 Mal. Lassen Sie uns nicht über die Rekursion von mehr als 10.000 Mal sprechen. 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 mit Java gespielt, aber diese Codezeilen sind trotzdem stressfrei. Ich werde das Chaos schnell beseitigen und es in Python-Code ändern

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

Fügen Sie den Code ein, F5, etwas ist schiefgelaufen

Diese Version des Codes dauerte ursprünglich nicht lange, weil eine Folge von zehnstelligen Ganzzahlen direkt verwendet werden kann Es kann verwendet werden, daher bezweifle ich, dass es etwas mit long zu tun hat

Natürlich hat es tatsächlich nichts mit long zu tun Die von unterstützte Ganzzahllänge Python ist sehr lang. Siehe den zuvor geschriebenen Code:

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 wandelt eine lange Folge von Dezimalzahlen in eine hexadezimale Darstellung um, oder es kann kann in ein beliebiges Hexadezimalsystem oder in ein hexadezimales Oktalsystem konvertiert werden. Und hexadezimal, verwenden Sie einfach oct(), hex(), um es zu lösen, und verwenden Sie die euklidische Division, um es zu lösen

Daher kann es gesehen werden Dass der Fehler nicht in der Größe der Zahl liegt, ist 11589 ja gerade bei Computern nur eine Beilage, 2^16 und 65536 gibt es

Eigentlich habe ich es erst hier herausgefunden dass der wahre Grund für den vorherigen rekursiven Fehler nicht erwähnt wurde und ich verärgert war

Der Grund für den rekursiven Fehler lag an Python. Das Standard-Rekursionslimit beträgt nur etwa 1000 Mal, aber hier müssen wir 10000 ausführen Ich habe lange damit verbracht, es zu putzen: RuntimeError: maximale Rekursionstiefe überschritten

Also habe ich es schnell überprüft und festgestellt, dass ich das Rekursionslimit selbst festlegen kann Erweiterung, Sie können auch die offizielle Website-Dokumentation überprüfen

Um Vorteile und Abstürze zu vermeiden, fügt die Python-Sprache im Allgemeinen standardmäßig ein Limit für die Anzahl der Male hinzu. Wenn ich dieses Limit also ändere, wird dies der Fall sein OK?

import sys

# setze die maximale Tiefe auf 20000

sys.setrecursionlimit(20000)

Füge den obigen Code ein und ändere ihn entscheidend auf 20000. Jetzt sollte es kein Problem mit dieser Einschränkung geben, aber das Ergebnis war schockierend. Ich war verwirrt

und habe nicht weiter nachgefragt Ich habe es besprochen, bin aber nicht näher auf dieses Thema eingegangen. Aber wenn es um die Effizienz rekursiver Operationen in praktischen Anwendungen geht, sieht man die Verwendung von Rekursion tatsächlich selten, außer in Lehrbüchern, obwohl ich nicht allzu beeindruckt bin, aber eine for-Anweisung kann damit umgehen

Der Code lautet wie folgt:

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


Mit nur wenigen Codezeilen war es im Handumdrehen erledigt. Als ich an das letzte Interview dachte, fragte mich der TX-Interviewer nach dem Algorithmus. Damals erwähnte er die Verwendung von Rekursion zur Implementierung einer Operation.


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 erinnere mich nicht genau an das spezifische Konzept der Iteration). Ich bin mir jedoch sicher, dass es auch nach Hunderttausenden von Operationen kein Problem geben wird Wenn ich das Rekursionslimit geändert habe, bin ich immer noch auf einen Strike gestoßen

Schließlich posten Sie einen Link zu Python Long VS C Long Long. Wenn Sie interessiert sind, können Sie es sich ansehen

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