-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathfibonacci.py
More file actions
executable file
·41 lines (35 loc) · 1.37 KB
/
fibonacci.py
File metadata and controls
executable file
·41 lines (35 loc) · 1.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python3
"""
Dieses Programm berechnet die Fibonacci-Reihe rekursiv (siehe Level 5).
Dabei werden aber die Zwischenergebnisse gecachet.
"""
def cache(func):
"""
Dies ist ein Dekorator der Funktionsaufrufe cachet.
Er funktioniert natürlich nur sinnvoll für mathematische Funktionen,
also Funktionen, die beim Aufruf mit den gleichen Parametern immer das gleiche Ergebnis zurückliefern und sonst keine Seiteneffekte haben.
Dieser Cache hat keinerlei Ersetzungs- oder Löschstrategien, wird also mit der Zeit immer größer.
Das ist nicht ideal, reicht aber für dieses Beispiel.
"""
# ein Dict erzeugen für die zwischengespeicherten Werte
values = dict()
# die neue Funktion
# hier der Einfachheit halber nur positionale Parameter
def new_func(*args):
# Ist der Wert schon berechnet worden?
if args in values.keys():
# dann gebe das Ergebnis zurück
return values[args]
# Ansonsten müssen wir die Funktion aufrufen und das Ergebnis speichern.
result = func(*args)
values[args] = result
return result
return new_func
# die gleiche nicht-performante Version von Fibonacci wie in Level 5
@cache
def fib(n: int) -> int:
if n <= 1:
return n
return fib(n-1) + fib(n-2)
n = int(input("Welches Element soll berechnet werden? "))
print(" =>", fib(n))