-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathm07_rekursion.py
More file actions
127 lines (102 loc) · 2.97 KB
/
Copy pathm07_rekursion.py
File metadata and controls
127 lines (102 loc) · 2.97 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""
Modul 07: Rekursion
"""
# 1) Fibonacci-Zahlen:
# Die nächste Zahl der Folge ist die Summe der beiden vorhergehenden Zahlen der Folge
# fib(n) 0 1 1 2 3 5 8 13 21 34
# n 0 1 2 3 4 5 6 7 8 9
# a b | a + b
# - 0 | 0 n = 0
# 0 1 |
# 0 1 | 1 n = 1
# 1 1 | 2 n = 2
# 1 2 | 3 n = 3
# 2 3 | 5 n = 4
# 3 5 | 8 n = 5
# ...
wunschzahl = 9
def fib(n):
"""
_summary_
Arguments:
n -- Positiver Integer, welche Zahl ausgegeben werden soll
Returns:
Gibt 0 bei 0 zurück und n-te Fibonacci-Zahl bei n > 0
"""
if n == 0:
return 0
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
print(fib(wunschzahl))
# Rekursive Lösung (Rekursion: Eine Funktion, die sich selbst aufruft)
# Die nächste Zahl der Folge ist die Summe der beiden vorhergehenden Zahlen der Folge.
# fib(n) = fib(n - 1) + fib(n -2) für n >= 2 # rekursive Definition
# fib(0) = 0
# fib(1) = 1
# fib(2) = 1
def fib_rekursiv(n):
"""
Ruft sich selbst rekursiv auf, um Fibonacci-Zahlen zurückzugeben, ist aber ineffizient
(berechnet immer wieder neu)
Arguments:
n -- Positiver Integer, welche Zahl ausgegeben werden soll
Returns:
Gibt 0 bei 0 zurück und n-te Fibonacci-Zahl bei n > 0
"""
if n >= 2:
return fib_rekursiv(n - 1) + fib_rekursiv(n - 2)
if n == 0:
return 0
return 1
print(fib_rekursiv(wunschzahl))
d = {}
def fib_rekursiv_memo(n):
"""
Ruft sich selbst rekursiv auf, um Fibonacci-Zahlen zurückzugeben,
speichert aber die Zwischenergebnisse in einer Dictionary
Arguments:
n -- Positiver Integer, welche Zahl ausgegeben werden soll
Returns:
Gibt 0 bei 0 zurück und n-te Fibonacci-Zahl bei n > 0
"""
if n in {0, 1}:
return n
if n in d: # Haben wir den Wert für n schon einmal berechnet?
return d[n] # Wenn ja: Gib diesen einfach zurück, indem du ihn im Wörterbuch nachschlägst.
if n >= 2:
d[n] = fib_rekursiv_memo(n - 1) + fib_rekursiv_memo(n - 2)
return d[n]
print(fib_rekursiv_memo(wunschzahl))
def hanoi(n, start, hilf, ziel):
"""
Gibt die Abfolge von Aktionen zurück, um Turm von Hanoi
mit n Scheiben auf start, hilf und ziel benannte "Säulen" zu verteilen
Arguments:
n -- integer: Wie viele Scheiben hat der Turm?
start -- string: name der Start-Säule
hilf -- string: name der Hilfs-Säule
ziel -- string: name der Ziel-Säule
"""
if n == 0:
return
hanoi(n - 1, start, ziel, hilf)
print("Bewege Scheibe", n, "von", start, "nach", ziel)
hanoi(n - 1, hilf, start, ziel)
hanoi(5, "a", "b", "c")
def mach_schoener(funktion):
"""
_summary_
Arguments:
funktion -- _description_
Returns:
_description_
"""
ds = {}
def schoenere_funktion(n):
if n in ds:
return ds[n]
ds[n] = funktion(n)
return ds[n]
return schoenere_funktion