\documentclass{bschlangaul-aufgabe} \bLadePakete{java,vollstaendige-induktion} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 1: „Rekursion und Induktion“}, Thematik = {Klasse „LeftFactorial“ und Methode „lfBig()“}, Referenz = 66115-2014-F.T1-A1, RelativerPfad = Examen/66115/2014/03/Thema-1/Aufgabe-1.tex, ZitatSchluessel = examen:66115:2014:03, ZitatBeschreibung = {Seite 2-3}, BearbeitungsStand = mit Lösung, Korrektheit = korrekt, Ueberprueft = {Die Teilaufgabe b mit einer Dozentenlösung abgeglichen}, Stichwoerter = {Vollständige Induktion, Rekursion, Implementierung in Java, Dynamische Programmierung}, EinzelpruefungsNr = 66115, Jahr = 2014, Monat = 03, ThemaNr = 1, AufgabeNr = 1, } \let\m=\bInduktionMarkierung \let\e=\bInduktionErklaerung % lf = lfLong \def\lf#1{\text{lfLong}(#1)} % sk = summe k \def\sk#1{\sum^{#1}_{k=0}k!} \begin{enumerate} %% % a) %% \item Gegeben\index{Vollständige Induktion}\index{Rekursion} \footcite[Seite 2-3]{examen:66115:2014:03} sei die Methode \bJavaCode{BigInteger lfBig(int n)} zur Berechnung der eingeschränkten Linksfakultät:\footcite[Seite 25]{aud:fs:1} \begin{equation*} !n := \begin{cases} n !(n - 1) - (n - 1) !(n - 2) & \text{falls } 1 < n < 32767 \\ 1 & \text{falls } n = 1 \\ 0 & \text{sonst } \\ \end{cases} \end{equation*} \bJavaExamen[firstline=3,lastline=30]{66115}{2014}{03}{LeftFactorial} Implementieren Sie unter Verwendung des Konzeptes der \emph{dynamischen Programmierung} die Methode \bJavaCode{BigInteger dp(int n)}, die jede $!n$ auch bei mehrfachem Aufrufen mit dem gleichen Parameter höchstens einmal rekursiv berechnet. Sie dürfen der Klasse \bJavaCode{LeftFactorial} genau ein Attribut beliebigen Datentyps hinzufügen und die in \bJavaCode{lfBig(int)} verwendeten Methoden und Konstanten ebenfalls nutzen.\footcite[Aufgabe 5]{aud:pu:1} \index{Implementierung in Java}\index{Dynamische Programmierung} \begin{bAntwort} Wir führen ein Attribut mit dem Namen \bJavaCode{store} ein und erzeugen ein Feld vom Typ \bJavaCode{BigInteger} mit der Länge $n + 1$. Die Länge des Feld $n + 1$ hat den Vorteil, dass nicht ständig $n - 1$ verwendet werden muss, um den gewünschten Wert zu erhalten. In der untenstehenden Implementation gibt es zwei Methoden mit dem Namen \bJavaCode{dp}. Die untenstehende Methode ist nur eine Hüllmethode, mit der nach außen hin die Berechnung gestartet und das \bJavaCode{store}-Feld neu gesetzt wird. So ist es möglich \bJavaCode{dp()} mehrmals hintereinander mit verschiedenen Werten aufzurufen (siehe \bJavaCode{main()}-Methode). \bJavaExamen[firstline=32,lastline=52]{66115}{2014}{03}{LeftFactorial} \end{bAntwort} %% % b) %% \item Betrachten Sie nun die Methode \bJavaCode{lfLong(int)} zur Berechnung der vorangehend definierten Linksfakultät ohne obere Schranke. Nehmen Sie im Folgenden an, dass der Datentyp \bJavaCode{long} unbeschränkt ist und daher kein Überlauf auftritt. \bJavaExamen[firstline=54,lastline=62]{66115}{2014}{03}{LeftFactorial} Beweisen Sie \emph{formal} mittels \emph{vollständiger Induktion}: \begin{displaymath} \forall n \geq 0: \lf{n} \equiv \sk{n - 1} \end{displaymath} \begin{bAntwort} %% % %% \bInduktionAnfang \begin{displaymath} n=1 \Rightarrow \texttt{\lf{1}} = 1 = \sk{n - 1} = 0! = 1 \end{displaymath} \begin{equation*} \begin{split} n=2 \Rightarrow & \lf{2}\\ & = (n + 1) \sk{n - 1} - n \sk{n-2} \\ & = \texttt{2 * \lf{1} - 1 * \lf{0}} \\ & = 2 \\ & = \sk{1} \\ & = 1! + 0! \\ & = 1 + 1 \\ & = 2 \end{split} \end{equation*} %% % %% \bInduktionVoraussetzung \begin{displaymath} \texttt{\lf{n}} = \sk{n - 1} \end{displaymath} %% % %% \bInduktionSchritt \begin{align*} A(n + 1) \\ & = \texttt{\lf{n + 1}}\\ & = \texttt{(n + 1) * \lf{n} - n * \lf{n - 1}} \\ & = (n + 1) \m{\sk{n - 1}} - n \m{\sk{(n - 1) -1}} & \e{Formel eingesetzt}\\ % & = (n + 1) \sk{n - 1} - n \sk{n\m{-2}} & \e{subtrahiert}\\ % & = n\sk{n - 1} + \sk{n - 1} - n \sk{n \m{- 2}} & \e{ausmultipliziert mit $(n + 1)$}\\ % & = \sk{n - 1} + \m{n\sk{n - 1}} - n \sk{n -2} & \e{Reihenfolge der Terme geändert}\\ % & = \sk{n - 1} + n \Bigl(\m{(n - 1)!} + \sk{n - \m{2}}\Bigr) - n \sk{n-2} & \e{$(n - 1)!$ aus Summenzeichen entfernt}\\ % & = \sk{n - 1} + \m{n} \Bigl((n - 1)! + \sk{n - 2} \m{- \sk{n-2}}\Bigr) & \e{Distributivgesetz $ac - bc = (a - b)c$}\\ % & = \sk{n - 1} + \m{n(n - 1)!} & \e{$+\Sigma-\Sigma=0$}\\ % & = \sk{n - 1} + \m{n!} & \e{Fakultät erhöht}\\ % & = \sk{\m{n}} & \e{Element zum Summenzeichen hinzugefügt}\\ % & = \sk{\m{(n + 1)}-1} & \e{mit $(n + 1)$ an der Stelle von $n$}\\ \end{align*} \end{bAntwort} \begin{bAdditum} \bPseudoUeberschrift{Komplette Klasse LeftFactorial} \bJavaExamen{66115}{2014}{03}{LeftFactorial} \end{bAdditum} \end{enumerate} \end{document}