From d147717c39ebee8ea16ee2d9af7a0ac8aac6cfbb Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Fri, 1 Dec 2023 08:35:08 +0100 Subject: [PATCH] added tut07 --- Tutorium/tut07/README.md | 169 ++++++++++++++++++ Tutorium/tut07/img/ws2022-notenverteilung.png | Bin 0 -> 11778 bytes Tutorium/tut07/img/ws2022-studienleistung.png | Bin 0 -> 10468 bytes .../src/solutions-exercise-06/mastermind.py | 57 ++++++ .../src/solutions-exercise-06/typevars.py | 35 ++++ Tutorium/tut07/src/trees.py | 36 ++++ Tutorium/tut07/src/tutorium_07.py | 55 ++++++ 7 files changed, 352 insertions(+) create mode 100644 Tutorium/tut07/img/ws2022-notenverteilung.png create mode 100644 Tutorium/tut07/img/ws2022-studienleistung.png create mode 100644 Tutorium/tut07/src/solutions-exercise-06/mastermind.py create mode 100644 Tutorium/tut07/src/solutions-exercise-06/typevars.py create mode 100644 Tutorium/tut07/src/trees.py create mode 100644 Tutorium/tut07/src/tutorium_07.py diff --git a/Tutorium/tut07/README.md b/Tutorium/tut07/README.md index e69de29..33ce71c 100644 --- a/Tutorium/tut07/README.md +++ b/Tutorium/tut07/README.md @@ -0,0 +1,169 @@ +# 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 + ``` \ No newline at end of file diff --git a/Tutorium/tut07/img/ws2022-notenverteilung.png b/Tutorium/tut07/img/ws2022-notenverteilung.png new file mode 100644 index 0000000000000000000000000000000000000000..762909f50e80d12ba7250cabf4a4076e622ea077 GIT binary patch literal 11778 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 literal 0 HcmV?d00001 diff --git a/Tutorium/tut07/img/ws2022-studienleistung.png b/Tutorium/tut07/img/ws2022-studienleistung.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6665d4d669af6a31a79255e5ab5a1dcec43f2d GIT binary patch literal 10468 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 gk59{=n5-MVt2`OIEaWVdkHEqE6tL2g$4e+yDRo literal 0 HcmV?d00001 diff --git a/Tutorium/tut07/src/solutions-exercise-06/mastermind.py b/Tutorium/tut07/src/solutions-exercise-06/mastermind.py new file mode 100644 index 0000000..7d8dbf6 --- /dev/null +++ b/Tutorium/tut07/src/solutions-exercise-06/mastermind.py @@ -0,0 +1,57 @@ +import random + + +def remove_char(string: str, c: str) -> str: + for i, s in enumerate(string): + if s == c: + return string[:i] + string[i + 1:] + return string + + +def perfect_chars(inp: str, sol: str) -> str: + chars = "" + for c, s in zip(inp, sol): + if c == s: + chars = chars + c + return chars + + +def correct_chars(inp: str, sol: str) -> str: + res = "" + for c in inp: + if c in sol: + res += c + sol = remove_char(sol, c) + return res + + +def compare(inp: str, sol: str) -> tuple[int, int]: + perfect = len(perfect_chars(inp, sol)) + correct = len(correct_chars(inp, sol)) + return perfect, correct - perfect + + +def compare_alt(inp: str, sol: str) -> tuple[int, int]: + perfect = perfect_chars(inp, sol) + for c in perfect: + sol = remove_char(sol, c) + inp = remove_char(inp, c) + correct = correct_chars(inp, sol) + return len(perfect), len(correct) + + +def game(length: int, symbols: str): + solution = "".join(random.choices(symbols, k=length)) + print("Länge:", length, "Zeichen:", symbols) + result = (0, 0) + while result != (length, 0): + c = input() + if len(c) != length: + print("Try again!") + continue + result = compare(c, solution) + print("Antwort:", result[0] * "X" + result[1] * "-") + + +if __name__ == '__main__': + game(5, "ABCDE") diff --git a/Tutorium/tut07/src/solutions-exercise-06/typevars.py b/Tutorium/tut07/src/solutions-exercise-06/typevars.py new file mode 100644 index 0000000..2c79ae1 --- /dev/null +++ b/Tutorium/tut07/src/solutions-exercise-06/typevars.py @@ -0,0 +1,35 @@ +from typing import Optional + + +def head[T](xs: list[T]) -> Optional[T]: + if not xs: + return None + return xs[0] + + +def tail[T](xs: list[T]) -> Optional[list[T]]: + if not xs: + return None + return xs[1:] + + +def concat[T](xss: list[list[T]]) -> list[T]: + outer = list() + for xs in xss: + outer += xs + return outer + + +def zip[T, U](xs: list[T], ys: list[U]) -> list[tuple[T, U]]: + out = list() + for i, x in enumerate(xs): + if i >= len(ys): + return out + else: + out += [(x, ys[i])] + return out + + +def assoc[T, U, V](t: tuple[tuple[T, U], V]) -> tuple[T, tuple[U, V]]: + (x, y), z = t + return (x, (y, z)) diff --git a/Tutorium/tut07/src/trees.py b/Tutorium/tut07/src/trees.py new file mode 100644 index 0000000..fcc4c52 --- /dev/null +++ b/Tutorium/tut07/src/trees.py @@ -0,0 +1,36 @@ +@dataclass +class Node[T]: + value: T + left: Optional['Node[T]'] = None + right: Optional['Node[T]'] = None + +type BTree[T] = Node[T] | None + +def preorder[T](tree: BTree[T]): + match tree: + case Node(value, left, right): + print(value) + preorder(left) + preorder(right) + case _: + return + + +def postorder[T](tree: BTree[T]): + match tree: + case Node(value, left, right): + postorder(left) + postorder(right) + print(value) + case _: + return + + +def inorder[T](tree: BTree[T]): + match tree: + case Node(value, left, right): + inorder(left) + print(value) + inorder(right) + case _: + return \ No newline at end of file diff --git a/Tutorium/tut07/src/tutorium_07.py b/Tutorium/tut07/src/tutorium_07.py new file mode 100644 index 0000000..71356f0 --- /dev/null +++ b/Tutorium/tut07/src/tutorium_07.py @@ -0,0 +1,55 @@ +def fibonacci(n: int) -> int: + if n in {0, 1}: # Abbruchbedingung + return n + return fibonacci(n - 1) + fibonacci(n - 2) # mehrere Rekursionsaufrufe + + +def fac(n: int) -> int: + if n <= 0: # Abbruchbedingung, kein Rekursiver Aufruf mehr! + return 1 + return n * fac(n - 1) # Rekursiver Aufruf + + +def fac2(n: int) -> int: + num = 1 + for i in range(1, n + 1): + num *= i + return num + + +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)) + + +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}: + return str(n) + return f"({fib_str(n - 1)} + {fib_str(n - 2)})" + + +if __name__ == "__main__": + assert [fibonacci(n) for n in range(15)] == [0, 1, 1, 2, + 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377] + assert [fac(n) for n in range(11)] == [1, 1, 2, 6, 24, + 120, 720, 5040, 40320, 362880, 3628800] + assert [fac(n) for n in range(10)] == [fac2(n) for n in range(10)] + assert list(reversed(all_fac(10))) == [(n, fac(n)) for n in range(11)] + assert all_fac_str(0, 10) == "1 1 2 6 24 120 720 5040 40320 362880 3628800"