Python Rekursion test in PyCharm - Prozess beendet mit exit code 139

System: Ubuntu 14

IDE: PyCharm Community Edition 3.1.1

Python: 2.7.6

Algorithmus mit dem immer wiederkehrenden Ruf:

def fibonacci_dynamic(n):
    if n == 0:
       return 0
    if n == 1:
       return 1
    computed_values = {1: 1, 2: 1}
    return memoize(n, computed_values)


def memoize(n, computed_values):
    if n in computed_values:
        return computed_values[n]
    #recurrent call
    computed_values[n - 1] = memoize(n - 1, computed_values)
    computed_values[n - 2] = memoize(n - 2, computed_values)
    new_value = computed_values[n - 1] + computed_values[n - 2]
    computed_values[n] = new_value
    return new_value

Test:

from unittest import TestCase
from first.fib.fibonacci import fibonacci_dynamic
import sys
sys.setrecursionlimit(40000)


class TestFibonacci_dynamic_param(TestCase):

    def test_fibonacci_dynamic_26175(self):
        result = fibonacci_dynamic(26175)
        self.assertIsNotNone(result)

Wert im test sollen. Um den Wert 26175 test manchmal passieren aber manchmal ist es abgebrochen mit der Meldung:
Process finished with exit code 139
Ich verstehe, dass test-Ergebnis-irgendwie ist, hängt von hardware-Ressourcen, aber ich bin auf der Suche nach genauere Antwort von stackoverflow Senioren 🙂

  • Entfernen sys.setrecursionlimit(40000) und Sie nicht bekommen, dass der Fehler nicht mehr. Es wird verursacht, weil der call-stack überlaufen ist. (Tipp: wenn Sie jemals brauchen werden, zu nennen setrecursionlimit es etwas falsch in deinem code).
  • Ich brauche diese, weil ohne diese Rekursion limit erreicht habe und ich bekomme die Fehlermeldung 'Absturz mit Laufzeitfehler: maximale Rekursionstiefe überschritten'
  • Sie haben 3 Möglichkeiten: 1) Leben mit der RuntimeException die Sie fangen können, und versuchen, Sie zu behandeln, 2) Verwenden setrecursionlimit zu vermeiden, die Ausnahme, bekomme aber "segmentation fault" statt (mit größeren Eingängen), die nicht behandelt werden kann 3) Fixieren Sie die Implementierung des Codes zu vermeiden, die große Anzahl der Aufrufe von Rekursion und berechnen viel größere fibonacci-zahlen.
  • Die dynamische Programmierung ist es zu vermeiden sich wiederholende Lösung von Teilproblemen mehr als einmal. Nun, denken Sie, dass Sie Ihre Funktion erreichen? Denkst du, dass die Reihenfolge, in der Sie ausführen, der rekursive Aufruf in memoize Fragen?
  • Guter Punkt - das problem kam, als ich war in der Mitte zu erstellen Präsentation zu optimieren - so dass, warum dieser Algorithmus ist nicht optimal - ich habe versucht, erhalten die Ergebnisse für den Vergleich mit der Iteration-Ansatz 🙂
InformationsquelleAutor pbaranski | 2014-05-10
Schreibe einen Kommentar