File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 99# Die Fibonacci-Folge ist rekursiv definiert
1010# - trotzdem ist die rekursive Berechnung ziemlich ineffizient im Vergleich zur Iterativen;
1111# siehe dazu https://github.com/pythonfoo/pythonfooLite/wiki/Rekursion_Vs._Iteration.
12+ # Eine wesentlich perfomantere Version findet sich in Level 7.
1213
1314def fib (n ):
1415 # Die ersten beiden Elemente sind fix:
Original file line number Diff line number Diff line change 1+ #!/usr/bin/env python3
2+ """
3+ Dieses Programm berechnet die Fibonacci-Reihe rekursiv (siehe Level 5).
4+ Dabei werden aber die Zwischenergebnisse gecachet.
5+ """
6+
7+ def cache (func ):
8+ """
9+ Dies ist ein Dekorator der Funktionsaufrufe cachet.
10+ Er funktioniert natürlich nur sinnvoll für mathematische Funktionen,
11+ also Funktionen, die beim Aufruf mit den gleichen Parametern immer das gleiche Ergebnis zurückliefern und sonst keine Seiteneffekte haben.
12+
13+ Dieser Cache hat keinerlei Ersetzungs- oder Löschstrategien, wird also mit der Zeit immer größer.
14+ Das ist nicht ideal, reicht aber für dieses Beispiel.
15+ """
16+ # ein Dict erzeugen für die zwischengespeicherten Werte
17+ values = dict ()
18+
19+ # die neue Funktion
20+ # hier der Einfachheit halber nur positionale Parameter
21+ def new_func (* args ):
22+ # Ist der Wert schon berechnet worden?
23+ if args in values .keys ():
24+ # dann gebe das Ergebnis zurück
25+ return values [args ]
26+ # Ansonsten müssen wir die Funktion aufrufen und das Ergebnis speichern.
27+ result = func (* args )
28+ values [args ] = result
29+ return result
30+
31+ return new_func
32+
33+ # die gleiche unpeformante Version von Fibonacci wie in Level 5
34+ @cache
35+ def fib (n ):
36+ if n <= 1 :
37+ return n
38+ return fib (n - 1 ) + fib (n - 2 )
39+
40+ n = int (input ("Welches Element soll berechnet werden? " ))
41+ print (" =>" , fib (n ))
You can’t perform that action at this time.
0 commit comments