# Tutorium 07 - 01.12.2023 ## Execrise 06 - Korrektur wieder am Samstag ### Problematik ChatGPT und Plagiate - ChatGPT ist ein tolles Tool, warum? - Manchmal liefert es andere Lösungen zu Problemen - Grundverständnis bei neuen Problemen - integriert in die IDE (z.B. Github Copilot): - schneller Code schreiben
Wie viele Zeilen Code schreibt ein Entwickler durchschnittlich am Tag? 10 bis 50 Codezeilen
- Leichtsinnsfehler ausbessern - Kurz: Es nimmt einen repetetive Arbeit ab #### Die Problematik? - Ein EidP soll das Grundverständnis von Programmieren vermittelt werden - Denkweise - Konzepte in der theoretischen Informatik - Konzepte in Programmiersprachen - Übung - Um ChatGPT sinnvoll zu nutzen müsst ihr diese Grundverständnis bereits besitzen - Auch Studierende mit Vorwissen profitieren davon die Übung sinnvoll zu bearbeiten - Wenn Ihr für die Aufgaben ChatGPT verwendet, dann habt ihr nicht genug Vorwissen
Studienleistung WS2022
Notenverteilung WS2022
#### Also, macht eure Aufgaben selber! ---- ## Wichtiges/Hilfreiches für Exercise-07 ### Rekursion - Rekursion in Python sind Funktionen die sich selbst aufrufen ```python def fac(n: int) -> int: if n <= 1: # Abbruchbedingung, kein Rekursiver Aufruf mehr! return 1 return n * fac(n - 1) # Rekursiver Aufruf ``` - Eine Rekursion braucht eine **Abbruchbedingung** - primitive Rekursionen können auch einfach iterative gelöst werden ```python def fac2(n: int) -> int: fac = 1 for i in range(1, n + 1): fac *= i return fac ``` - Eine Rekursion kann mehrere Rekursionspfade haben! (Kaskadenförmige Rekursion), welche auch primitiv berechenbar sind! ```python def fib(n: int) -> int: if n in {0, 1}: # Abbruchbedingung return n return fib(n - 1) + fib(n - 2) # mehrere Rekursionsaufrufe ``` - Wie Funktioniert das? - Es wird ein Rekursionsbaum aufgebaut - Wenn dieser Fertig ist wird berechnet - Z.b. `fac`: ``` fac(5) 5 * fac(4) 5 * 4 * fac(3) 5 * 4 * 3 * fac(2) 5 * 4 * 3 * 2 * fac(1) 5 * 4 * 3 * 2 * 1 120 ``` ``` fib(4) fib(3) + fib(2) (fib(2) + fib(1)) + (fib(0) + fib(1)) ((fib(0) + fib(1)) + fib(1)) + (fib(0) + fib(1)) ((0 + 1) + 1) + (0 + 1) 3 ``` - Gibt es Rekursionen die nicht iterative berechenbar sind? - $\mu$-Rekursionen oder partiell Rekursionen - erste partiell rekursive Funktion von Wilhelm Ackermann 1926, die "Ackermannfunktion" $\alpha(0, m) = m + 1$ \ $\alpha(n, 0) = \alpha(n - 1, 1)$ \ $\alpha(n, m) = \alpha(n, \alpha(n, m - 1))$ ```python def ack(n: int, m: int) -> int: match (n, m): case (0, _): return m + 1 case (_, 0): return ack(n - 1, 1) case _: return ack(n - 1, ack(n, m - 1)) ``` #### Tipp: Man kann alles rekursiv Aufbauen mit Operatoren (`+, -, *, /, %, //, &&, and, ...`), also auch Listen oder Strings ```python def all_fac(max: int) -> list[(int, int)]: if max == 0: # Abbruchbedingung return [(0, 1)] return [(max, fac(max))] + all_fac(max - 1) # Rekursion def all_fac_str(min: int, max: int) -> str: if min >= max: # Abbruchbedingung return f"{fac(min)}" return f"{fac(min)} " + all_fac_str(min + 1, max) # Rekursion def fib_str(n: int) -> str: if n in {0, 1}: # Abbruchbedingung return str(n) return f"({fib_str(n - 1)} + {fib_str(n - 2)})" # Rekursion ``` --- ### Rekursion in Bäumen - Drei möglichkeiten einen Baum *abzulaufen* - **Pre-Order**: Knoten, links, rechts ```python def preorder[T](tree: BTree[T]): match tree: case Node(value, left, right): print(value) preorder(left) preorder(right) case _: return ``` - **Post-Order**: links, rechts, Knoten ```python def postorder[T](tree: BTree[T]): match tree: case Node(value, left, right): postorder(left) postorder(right) print(value) case _: return ``` - **In-Order**: links, Knoten, rechts ```python def inorder[T](tree: BTree[T]): match tree: case Node(value, left, right): inorder(left) print(value) inorder(right) case _: return ``` --- ## Fragen?