Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132930 views
License: OTHER
1
%!TEX root = Programmierparadigmen.tex
2
\chapter{Programmiertechniken}
3
\section{Rekursion}
4
\index{Rekursion|(}
5
6
\begin{definition}[rekursive Funktion]\xindex{Funktion!rekursive}%
7
Eine Funktion $f: X \rightarrow X$ heißt rekursiv definiert,
8
wenn in der Definition der Funktion die Funktion selbst wieder
9
steht.
10
\end{definition}
11
12
\begin{beispiel}[rekursive Funktionen]
13
\begin{bspenum}
14
\item Fibonacci-Funktion:\xindex{Fibonacci-Funktion}
15
\begin{align*}
16
fib: \mdn_0 &\rightarrow \mdn_0\\
17
fib(n) &= \begin{cases}
18
n &\text{falls } n \leq 1\\
19
fib(n-1) + fib(n-2) &\text{sonst}
20
\end{cases}
21
\end{align*}
22
Erzeugt die Zahlen $0, 1, 1, 2, 3, 5, 8, 13, \dots$
23
\item Fakultät:\xindex{Fakultät}
24
\begin{align*}
25
! &: \mdn_0 \rightarrow \mdn_0\\
26
n! &= \begin{cases}
27
1 &\text{falls } n \leq 1\\
28
n\cdot (n-1)! &\text{sonst}
29
\end{cases}
30
\end{align*}
31
\item \label{bsp:binomialkoeffizient} Binomialkoeffizient:\xindex{Binomialkoeffizient}
32
\begin{align*}
33
\binom{\cdot}{\cdot} &: \mdn_0 \times \mdn_0 \rightarrow \mdn_0\\
34
\binom{n}{k} &= \begin{cases}
35
1 &\text{falls } k=0 \lor k = n\\
36
\binom{n-1}{k-1}+\binom{n-1}{k} &\text{sonst}
37
\end{cases}
38
\end{align*}
39
\end{bspenum}
40
\end{beispiel}
41
42
Ein Problem von rekursiven Funktionen in Computerprogrammen ist der
43
Speicherbedarf. Für jeden rekursiven Aufruf müssen alle lokalen Variablen
44
der aufrufenden Funktion (\enquote{stack frame}) gespeichert bleiben,
45
bis der rekursive Aufruf beendet ist. Im Fall der Fibonacci-Funktion
46
sieht ist der Call-Stack in \cref{fig:fib-callstack} abgebildet.
47
48
\begin{figure}[htp]
49
\centering
50
\includegraphics*[width=0.5\linewidth, keepaspectratio]{figures/fib-callstack.png}
51
\caption{Call-Stack der Fibonacci-Funktion}
52
\label{fig:fib-callstack}
53
\end{figure}
54
55
\begin{bemerkung}
56
Die Anzahl der rekursiven Aufrufe der Fibonacci-Funktion $f_C$ ist:
57
\[f_C(n) = \begin{cases}
58
1 &\text{falls } n=0\\
59
2 \cdot fib(n) - 1 &\text{falls } n \geq 1
60
\end{cases}\]
61
\end{bemerkung}
62
\begin{beweis}\leavevmode
63
\begin{itemize}
64
\item Offensichtlich gilt $f_C(0) = 1$
65
\item Offensichtlich gilt $f_C(1) = 1 = 2 \cdot fib(1) - 1$
66
\item Offensichtlich gilt $f_C(2) = 3 = 2 \cdot fib(2) - 1$
67
\item Für $n \geq 3$:
68
\begin{align*}
69
f_C(n) &= 1 + f_C(n-1) + f_C(n-2)\\
70
&= 1 + (2\cdot fib(n-1)-1) + (2 \cdot fib(n-2)-1)\\
71
&=2\cdot (fib(n-1) + fib(n-2)) - 1\\
72
&=2 \cdot fib(n) - 1
73
\end{align*}
74
\end{itemize}
75
\end{beweis}
76
77
Mit Hilfe der Formel von Moivre-Binet folgt:
78
79
\[f_C \in \mathcal{O} \left (\frac{\varphi^n- \psi^n}{\varphi - \psi} \right) \text{ mit } \varphi := \frac{1+ \sqrt{5}}{2} \text{ und }\psi := 1 - \varphi\]
80
81
Dabei ist der Speicherbedarf $\mathcal{O}(n)$. Dieser kann durch
82
das Benutzen eines Akkumulators signifikant reduziert werden.\todo{TODO}
83
84
\begin{definition}[linear rekursive Funktion]\xindex{Funktion!linear rekursive}%
85
Eine Funktion heißt linear rekursiv, wenn in jedem Definitionszweig
86
der Funktion höchstens ein rekursiver Aufruf vorkommt.
87
\end{definition}
88
89
\begin{definition}[endrekursive Funktion]\xindex{Funktion!endrekursive}\xindex{tail recursive}%
90
Eine Funktion heißt endrekursiv, wenn in jedem Definitionszweig
91
der Rekursive aufruf am Ende des Ausdrucks steht. Der rekursive
92
Aufruf darf also insbesondere nicht in einen anderen Ausdruck
93
eingebettet sein.
94
\end{definition}
95
96
Auf Englisch heißen endrekursive Funktionen \textit{tail recursive}.
97
98
\begin{beispiel}[Linear- und endrekursive Funktionen]
99
\begin{bspenum}
100
\item \texttt{fak n = if (n==0) then 1 else (n * fak (n-1))}\\
101
ist eine linear rekursive Funkion, aber nicht endrekursiv,
102
da nach der Rückgabe von \texttt{fak (n-1)} noch die Multiplikation
103
ausgewertet werden muss.
104
\item \texttt{fakAcc n acc = if (n==0) then acc else fakAcc (n-1) (n*acc)}\\
105
ist eine endrekursive Funktion.
106
\item \texttt{fib n = n <= 1 ? n : fib(n-1) + fib (n-2)}\\
107
ist weder linear- noch endrekursiv.
108
\end{bspenum}
109
\end{beispiel}
110
111
Wenn eine rekursive Funktion nicht terminiert oder wenn
112
113
\index{Rekursion|)}
114
\section{Backtracking}
115
\index{Backtracking|(}
116
Unter \textit{Backtracking} versteht man eine Programmiertechnik, die
117
(eventuell implizit) auf einem Suchbaum arbeitet und mittels Tiefensuche versucht
118
eine Lösung zu finden.
119
120
\begin{beispiel}[Backtracking]
121
Probleme, bei deren (vollständigen) Lösung Backtracking verwendet wird, sind:
122
\begin{bspenum}
123
\item Damenproblem
124
\item Springerproblem
125
\item Rucksackproblem
126
\end{bspenum}
127
\end{beispiel}
128
\index{Backtracking|)}
129
130
\section{Funktionen höherer Ordnung}
131
Funktionen höherer Ordnung sind Funktionen, die auf Funktionen arbeiten.
132
Bekannte Beispiele sind:
133
\begin{itemize}
134
\item \texttt{map(function, list)}\xindex{map}\\
135
\texttt{map} wendet \texttt{function} auf jedes einzelne
136
Element aus \texttt{list} an.
137
\item \texttt{filter(function, list)}\xindex{filter}\\
138
\texttt{filter} gibt eine Liste aus Elementen zurück, für
139
die \texttt{function} mit \texttt{true} evaluiert.
140
\item \texttt{reduce(function, list)}\xindex{reduce}\\
141
\texttt{function} ist für zwei Elemente aus \texttt{list}
142
definiert und gibt ein Element des gleichen Typs zurück.
143
Nun steckt \texttt{reduce} zuerst zwei Elemente aus \texttt{list}
144
in \texttt{function}, merkt sich dann das Ergebnis und nimmt
145
so lange weitere Elemente aus \texttt{list}, bis jedes
146
Element genommen wurde.\\
147
Bei \texttt{reduce} ist die Assoziativität wichtig (vgl. \cpageref{bsp:foldl-und-foldr})
148
\end{itemize}
149
150