📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / documents / Programmierparadigmen / Programmiertechniken.tex
132930 viewsLicense: OTHER
%!TEX root = Programmierparadigmen.tex1\chapter{Programmiertechniken}2\section{Rekursion}3\index{Rekursion|(}45\begin{definition}[rekursive Funktion]\xindex{Funktion!rekursive}%6Eine Funktion $f: X \rightarrow X$ heißt rekursiv definiert,7wenn in der Definition der Funktion die Funktion selbst wieder8steht.9\end{definition}1011\begin{beispiel}[rekursive Funktionen]12\begin{bspenum}13\item Fibonacci-Funktion:\xindex{Fibonacci-Funktion}14\begin{align*}15fib: \mdn_0 &\rightarrow \mdn_0\\16fib(n) &= \begin{cases}17n &\text{falls } n \leq 1\\18fib(n-1) + fib(n-2) &\text{sonst}19\end{cases}20\end{align*}21Erzeugt die Zahlen $0, 1, 1, 2, 3, 5, 8, 13, \dots$22\item Fakultät:\xindex{Fakultät}23\begin{align*}24! &: \mdn_0 \rightarrow \mdn_0\\25n! &= \begin{cases}261 &\text{falls } n \leq 1\\27n\cdot (n-1)! &\text{sonst}28\end{cases}29\end{align*}30\item \label{bsp:binomialkoeffizient} Binomialkoeffizient:\xindex{Binomialkoeffizient}31\begin{align*}32\binom{\cdot}{\cdot} &: \mdn_0 \times \mdn_0 \rightarrow \mdn_0\\33\binom{n}{k} &= \begin{cases}341 &\text{falls } k=0 \lor k = n\\35\binom{n-1}{k-1}+\binom{n-1}{k} &\text{sonst}36\end{cases}37\end{align*}38\end{bspenum}39\end{beispiel}4041Ein Problem von rekursiven Funktionen in Computerprogrammen ist der42Speicherbedarf. Für jeden rekursiven Aufruf müssen alle lokalen Variablen43der aufrufenden Funktion (\enquote{stack frame}) gespeichert bleiben,44bis der rekursive Aufruf beendet ist. Im Fall der Fibonacci-Funktion45sieht ist der Call-Stack in \cref{fig:fib-callstack} abgebildet.4647\begin{figure}[htp]48\centering49\includegraphics*[width=0.5\linewidth, keepaspectratio]{figures/fib-callstack.png}50\caption{Call-Stack der Fibonacci-Funktion}51\label{fig:fib-callstack}52\end{figure}5354\begin{bemerkung}55Die Anzahl der rekursiven Aufrufe der Fibonacci-Funktion $f_C$ ist:56\[f_C(n) = \begin{cases}571 &\text{falls } n=0\\582 \cdot fib(n) - 1 &\text{falls } n \geq 159\end{cases}\]60\end{bemerkung}61\begin{beweis}\leavevmode62\begin{itemize}63\item Offensichtlich gilt $f_C(0) = 1$64\item Offensichtlich gilt $f_C(1) = 1 = 2 \cdot fib(1) - 1$65\item Offensichtlich gilt $f_C(2) = 3 = 2 \cdot fib(2) - 1$66\item Für $n \geq 3$:67\begin{align*}68f_C(n) &= 1 + f_C(n-1) + f_C(n-2)\\69&= 1 + (2\cdot fib(n-1)-1) + (2 \cdot fib(n-2)-1)\\70&=2\cdot (fib(n-1) + fib(n-2)) - 1\\71&=2 \cdot fib(n) - 172\end{align*}73\end{itemize}74\end{beweis}7576Mit Hilfe der Formel von Moivre-Binet folgt:7778\[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\]7980Dabei ist der Speicherbedarf $\mathcal{O}(n)$. Dieser kann durch81das Benutzen eines Akkumulators signifikant reduziert werden.\todo{TODO}8283\begin{definition}[linear rekursive Funktion]\xindex{Funktion!linear rekursive}%84Eine Funktion heißt linear rekursiv, wenn in jedem Definitionszweig85der Funktion höchstens ein rekursiver Aufruf vorkommt.86\end{definition}8788\begin{definition}[endrekursive Funktion]\xindex{Funktion!endrekursive}\xindex{tail recursive}%89Eine Funktion heißt endrekursiv, wenn in jedem Definitionszweig90der Rekursive aufruf am Ende des Ausdrucks steht. Der rekursive91Aufruf darf also insbesondere nicht in einen anderen Ausdruck92eingebettet sein.93\end{definition}9495Auf Englisch heißen endrekursive Funktionen \textit{tail recursive}.9697\begin{beispiel}[Linear- und endrekursive Funktionen]98\begin{bspenum}99\item \texttt{fak n = if (n==0) then 1 else (n * fak (n-1))}\\100ist eine linear rekursive Funkion, aber nicht endrekursiv,101da nach der Rückgabe von \texttt{fak (n-1)} noch die Multiplikation102ausgewertet werden muss.103\item \texttt{fakAcc n acc = if (n==0) then acc else fakAcc (n-1) (n*acc)}\\104ist eine endrekursive Funktion.105\item \texttt{fib n = n <= 1 ? n : fib(n-1) + fib (n-2)}\\106ist weder linear- noch endrekursiv.107\end{bspenum}108\end{beispiel}109110Wenn eine rekursive Funktion nicht terminiert oder wenn111112\index{Rekursion|)}113\section{Backtracking}114\index{Backtracking|(}115Unter \textit{Backtracking} versteht man eine Programmiertechnik, die116(eventuell implizit) auf einem Suchbaum arbeitet und mittels Tiefensuche versucht117eine Lösung zu finden.118119\begin{beispiel}[Backtracking]120Probleme, bei deren (vollständigen) Lösung Backtracking verwendet wird, sind:121\begin{bspenum}122\item Damenproblem123\item Springerproblem124\item Rucksackproblem125\end{bspenum}126\end{beispiel}127\index{Backtracking|)}128129\section{Funktionen höherer Ordnung}130Funktionen höherer Ordnung sind Funktionen, die auf Funktionen arbeiten.131Bekannte Beispiele sind:132\begin{itemize}133\item \texttt{map(function, list)}\xindex{map}\\134\texttt{map} wendet \texttt{function} auf jedes einzelne135Element aus \texttt{list} an.136\item \texttt{filter(function, list)}\xindex{filter}\\137\texttt{filter} gibt eine Liste aus Elementen zurück, für138die \texttt{function} mit \texttt{true} evaluiert.139\item \texttt{reduce(function, list)}\xindex{reduce}\\140\texttt{function} ist für zwei Elemente aus \texttt{list}141definiert und gibt ein Element des gleichen Typs zurück.142Nun steckt \texttt{reduce} zuerst zwei Elemente aus \texttt{list}143in \texttt{function}, merkt sich dann das Ergebnis und nimmt144so lange weitere Elemente aus \texttt{list}, bis jedes145Element genommen wurde.\\146Bei \texttt{reduce} ist die Assoziativität wichtig (vgl. \cpageref{bsp:foldl-und-foldr})147\end{itemize}148149150