Skip to content

Commit e8cd9c0

Browse files
committed
Level 7: Fibonacci rekursiv gecachet
1 parent 9899e1f commit e8cd9c0

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

Level_05/fibonacci.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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

1314
def fib(n):
1415
# Die ersten beiden Elemente sind fix:

Level_07/fibonacci.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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))

0 commit comments

Comments
 (0)