From 3a0ecb91a348d71dd2b30a163618dba0fb23e1f4 Mon Sep 17 00:00:00 2001 From: Amalia Sucipto Date: Thu, 12 Nov 2026 15:28:58 +0100 Subject: [PATCH] =?UTF-8?q?Aufgaben=20erg=C3=A4nzt=20inklusive=20Hausaufga?= =?UTF-8?q?be?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 07_quadratzahlen.py | 24 ++++++++++++++++++++++++ 08_ungeradezahlen.py | 0 10_treppenhaus.py | 0 11_münzwechsel.py | 42 ++++++++++++++++++++++++++++++++++++++++++ laufzeitmessung.py | 21 +++++++++++++++++++++ runonce.py | 21 +++++++++++++++++++++ 6 files changed, 108 insertions(+) create mode 100644 07_quadratzahlen.py create mode 100644 08_ungeradezahlen.py create mode 100644 10_treppenhaus.py create mode 100644 11_münzwechsel.py create mode 100644 laufzeitmessung.py create mode 100644 runonce.py diff --git a/07_quadratzahlen.py b/07_quadratzahlen.py new file mode 100644 index 0000000..a7a4ae4 --- /dev/null +++ b/07_quadratzahlen.py @@ -0,0 +1,24 @@ +"""Erweitern Sie die Klasse Squares zu einem Iterator mit __iter__ und __next__. Prüfen Sie, dass +list(Squares(4)) die Liste [1, 4, 9, 16] ergibt. Was passiert, wenn Sie denselben Iterator ein zweites Mal +durchlaufen?""" + +class Squares: + def __init__(self, n): + self.iter = 1 + self.n = n + + def __next__(self): + if self.iter > self.n: + raise StopIteration + + square = self.iter**2 + self.iter += 1 + + return square + + def __iter__(self): + return self + +squares = Squares(4) +print(list(squares)) +print(list(squares)) diff --git a/08_ungeradezahlen.py b/08_ungeradezahlen.py new file mode 100644 index 0000000..e69de29 diff --git a/10_treppenhaus.py b/10_treppenhaus.py new file mode 100644 index 0000000..e69de29 diff --git a/11_münzwechsel.py b/11_münzwechsel.py new file mode 100644 index 0000000..8093fd2 --- /dev/null +++ b/11_münzwechsel.py @@ -0,0 +1,42 @@ +"""Sophia hat unendlich viele Münzen der Werte 1, 2 und 5 (Yay!). Wie viele Möglichkeiten gibt es, einen bestimmten +Betrag n zu bilden? Sophia hat sich folgende rekursive Funktion überlegt: +def coins(n): + if n == 0: + return 1 + if n < 0: + return 0 + return coins(n-1) + coins(n-2) + coins(n-5) +Hm, ist die Lösung von Sophia richtig? Erklären Sie! Messen Sie die Laufzeit der Funktion mit unserem @timingDecorator für verschiedene n. +Auch hier hilft Memoization, um die Laufzeit zu verbessern. Warum? Überprüfen Sie das.""" + +from functools import cache +from laufzeitmessung import timing + +def coins(n): + if n == 0: + return 1 + if n < 0: + return 0 + return coins(n - 1) + coins(n - 2) + coins(n - 5) + +@cache +def coins_cached(n): + if n == 0: + return 1 + if n < 0: + return 0 + return (coins_cached(n-1) + coins_cached(n-2) + coins_cached(n-5)) + +@timing +def measure_normal(n): + return coins(n) + +@timing +def measure_cached(n): + coins_cached.cache_clear() + return coins_cached(n) + +print("Ohne Memoization: ") +print(measure_normal(20)) +print("Mit Memoization: ") +print(measure_cached(20)) \ No newline at end of file diff --git a/laufzeitmessung.py b/laufzeitmessung.py new file mode 100644 index 0000000..e8f3455 --- /dev/null +++ b/laufzeitmessung.py @@ -0,0 +1,21 @@ +"""Wir schreiben einen Decorator @timing, der die Laufzeit einer beliebigen Funktion misst. Wir verwenden *args +und **kwargs, damit der Decorator universell ist. +Hinweis: +Aus dem Standard-Modul time ist hier perf_counter hilfreich: +import time +start = time.perf_counter() +… +print(f"Dauer: {time.perf_counter() - start:.4f}s")""" + +import time + +def timing(f): + def wrapper(*args, **kwargs): + start = time.perf_counter() + result = f(*args, **kwargs) + end = time.perf_counter() + print(f"Dauer: {time.perf_counter() - start:.4f}s") + return result + return wrapper + + diff --git a/runonce.py b/runonce.py new file mode 100644 index 0000000..eaba8ae --- /dev/null +++ b/runonce.py @@ -0,0 +1,21 @@ +def run_once(f): + already_run = False + + def wrapper(*args, **kwargs): + nonlocal already_run + + if not already_run: + already_run = True + f(*args, **kwargs) + pass + + return wrapper + +@run_once +def begruessung(name): + print(f"Hallo {name}!") + +begruessung("Sophia") +begruessung("Max") +begruessung("Lisa") +