From 7d5391dae7e43d7e9ccf68b448de59dc84f8352e Mon Sep 17 00:00:00 2001 From: David Date: Wed, 5 Feb 2025 23:31:02 +0100 Subject: [PATCH] Aufgabe 3 Block 2 --- exercises/block2/1-map/README.md | 8 +++-- exercises/block2/2-zip/README.md | 9 +++-- exercises/block2/3-fibTail/README.md | 52 +++++++++++++++++++++++++++ exercises/block2/3-fibTail/fibTail.hs | 23 ++++++++++++ 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 exercises/block2/3-fibTail/README.md create mode 100644 exercises/block2/3-fibTail/fibTail.hs diff --git a/exercises/block2/1-map/README.md b/exercises/block2/1-map/README.md index c37b1cd..92f03e6 100644 --- a/exercises/block2/1-map/README.md +++ b/exercises/block2/1-map/README.md @@ -1,4 +1,4 @@ -# Aufgabe 1 - Rekursive Implementierung von `map` +# Aufgabe 2 - Rekursive Implementierung von `map` ## Ziel der Aufgabe Implementiere die Funktion `map` rekursiv. Die Funktion nimmt eine Funktion `f` und eine Liste `xs` und gibt eine neue Liste zurück, in der `f` auf jedes Element von `xs` angewendet wurde. @@ -22,5 +22,9 @@ map (+1) [] -- [] - Nutze Pattern Matching, um Basis- und Rekursionsfall zu unterscheiden ## Hinweise +
+ Klicke auf den Pfeil für Hinweise + - Die leere Liste `[]` soll als Basisfall betrachtet werden -- Die Funktion `f` soll auf das erste Element der Liste angewendet und dann mit dem Rest der Liste rekursiv weitergeführt werden \ No newline at end of file +- Die Funktion `f` soll auf das erste Element der Liste angewendet und dann mit dem Rest +
\ No newline at end of file diff --git a/exercises/block2/2-zip/README.md b/exercises/block2/2-zip/README.md index 7fd1e48..a599207 100644 --- a/exercises/block2/2-zip/README.md +++ b/exercises/block2/2-zip/README.md @@ -23,6 +23,11 @@ zip [1,2,3] [] -- [] - Nutze kein zip aus der Standardbibliothek - Die Funktion soll enden, sobald eine der beiden Listen leer ist + ## Hinweise -- Der Basisfall tritt ein, wenn eine der Listen leer ist -- Kombiniere das erste Element beider Listen zu einem Tupel und rufe zip rekursiv für die restlichen Elemente auf \ No newline at end of file +
+ Klicke auf den Pfeil für Hinweise + + - Der Basisfall tritt ein, wenn eine der Listen leer ist + - Kombiniere das erste Element beider Listen zu einem Tupel und rufe zip rekursiv für die restlichen Elemente auf +
diff --git a/exercises/block2/3-fibTail/README.md b/exercises/block2/3-fibTail/README.md new file mode 100644 index 0000000..95fc61d --- /dev/null +++ b/exercises/block2/3-fibTail/README.md @@ -0,0 +1,52 @@ +# Aufgabe 3 - Fibonacci mit Tail-Rekursion + +## Ziel der Aufgabe +Implementiere die Fibonacci-Funktion mit **Tail-Rekursion**, ähnlich wie die `factorialTail`-Funktion. Die Lösung soll eine Hilfsfunktion mit einem Akkumulator verwenden. + +
+ Spoiler: Klicke auf den Pfeil für factorialTail + +```haskell +factorialTail :: Integer -> Integer -> Integer +factorialTail 0 acc = acc +factorialTail n acc = factorialTail (n - 1) (n * acc) + +factorial :: Integer -> Integer +factorial n = factorialTail n 1 +``` +
+ + +## Signatur +```haskell +fibonacciTail :: Integer -> Integer -> Integer -> Integer + +``` + +## Beispiel Testfäle +``` +fibTail 0 -- 0 +fibTail 1 -- 1 +fibTail 5 -- 5 +fibTail 10 -- 55 +fibTail 15 -- 610 +``` + +## Anforderungen +- Implementiere fibonacciTail, eine Hilfsfunktion mit einem Akkumulator +- Implementiere fibonacci, die fibonacciTail mit den Startwerten 0 und 1 aufruft +- Nutze keine if-Statements, sondern Pattern Matching +- Nutze Tail-Rekursion für eine speichereffiziente Lösung + +## Hinweise +
+ Klicke auf den Pfeil für Hinweise + +- fibonacciTail benötigt drei Parameter: + - 1: n (die Anzahl der Schritte) + - 2: a (die vorherige Fibonacci-Zahl) + - 3: b (die aktuelle Fibonacci-Zahl) +- Wenn n == 0 ist, gib a zurück +- Wenn n == 1 ist, gib b zurück +- Ansonsten rufe die Funktion rekursiv mit n - 1 auf und verschiebe a und b +
\ No newline at end of file diff --git a/exercises/block2/3-fibTail/fibTail.hs b/exercises/block2/3-fibTail/fibTail.hs new file mode 100644 index 0000000..b080a50 --- /dev/null +++ b/exercises/block2/3-fibTail/fibTail.hs @@ -0,0 +1,23 @@ +-- Aufgabe: Implementiere die rekursive Fibonacci-Funktion mit Tail-Rekursion + +fibonacciTail :: Integer -> Integer -> Integer -> Integer +-- TODO: + +-- Testfälle +test1 = fibonacci 0 == 0 +test2 = fibonacci 1 == 1 +test3 = fibonacci 2 == 1 +test4 = fibonacci 3 == 2 +test5 = fibonacci 5 == 5 +test6 = fibonacci 10 == 55 + +-- Hauptfunktion zum Testen +main :: IO () +main = do + putStrLn "Teste fibonacci-Funktion mit Tail-Rekursion..." + print test1 + print test2 + print test3 + print test4 + print test5 + print test6 \ No newline at end of file