changeset 1:e532198d58f4

week 1 tutorial
author Markus Kaiser <markus.kaiser@in.tum.de>
date Fri, 19 Oct 2012 19:48:27 +0200
parents 9bd0c4f30c49
children 243f6cfa029a
files exercises/src/Exercise_1.hs
diffstat 1 files changed, 89 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/exercises/src/Exercise_1.hs	Wed Oct 17 14:47:38 2012 +0200
+++ b/exercises/src/Exercise_1.hs	Fri Oct 19 19:48:27 2012 +0200
@@ -4,31 +4,114 @@
 {---------------------------------------------------------------------}
 {- G1.1 -}
 threeDifferent :: Integer -> Integer -> Integer -> Bool
-threeDifferent x y z = undefined
+threeDifferent x y z = (x /= y) && (y /= z) && (z /= x)
+
 
 fourEqual :: Integer -> Integer -> Integer -> Integer -> Bool
-fourEqual w x y z = undefined
+fourEqual w x y z = (w == x) && (x == y) && (y == z)
+
+
+{-
+        threeDifferent (2+3) 5 (11 ` div ` 2)
+        ((2+3) /= 5) && (5 /= (11 ` div ` 2)) && ((11 ` div ` 2) /= (2+3))
+        (5 /= 5) && ((5 /= (11 ` div ` 2)) && ((11 ` div ` 2) /= (2+3)))
+        False && ((5 /= (11 ` div ` 2)) && ((11 ` div ` 2) /= (2+3)))
+        False
+
+        Schritte von oben nach unten:
+        threeDifferent ersetzen
+        Linke Seite des ersten &&
+        5 /= 5 auswerten
+        False && x = False (&& ist rechtsassoizativ)
+
+
+        ---
+
+
+        fourEqual (2+3) 5 (11 ` div ` 2) (21 ` mod ` 11)
+        ((2+3) == 5) && (5 == (11 ` div ` 2)) && ((11 ` div ` 2) == (21 ` mod ` 11))
+        (5 == 5) && (5 == (11 ` div ` 2)) && ((11 ` div ` 2) == (21 ` mod ` 11))
+        True && (5 == (11 ` div ` 2)) && ((11 ` div ` 2) == (21 ` mod ` 11))
+        (5 == (11 ` div ` 2)) && ((11 ` div ` 2) == (21 ` mod ` 11))
+        (5 == 5) && ((11 ` div ` 2) == (21 ` mod ` 11))
+        True && ((11 ` div ` 2) == (21 ` mod ` 11))
+        ((11 ` div ` 2) == (21 ` mod ` 11))
+        (5 == (21 ` mod ` 11))
+        (5 == 10)
+        False
+
+        Schritte von oben nach unten:
+        fourEqual ersetzen
+        Linke Seite des ersten &&
+        5 == 5 auswerten
+        True && x = x
+        Linke Seite des zweiten && (div ist Ganzzahldivision)
+        5 == 5 auswerten
+        True && x = x
+        Links nach rechts
+        5 == 10 auswerten
+-}
 
 
 
 {---------------------------------------------------------------------}
 {- G1.2 -}
 fac :: Integer -> Integer
-fac n = undefined
+fac 0 = 1
+fac n | n > 0 = n * fac (n-1)
+
 
 sum_ten :: Integer -> Integer
-sum_ten n = undefined
+sum_ten n = sum_ten' n 9
+        where
+        sum_ten' :: Integer -> Integer -> Integer
+        sum_ten' n 0 = n
+        sum_ten' n x = n + x + sum_ten' n (x-1)
+
+
+sum_ten_gauss :: Integer -> Integer
+sum_ten_gauss n = 10 * n + 45
 
 
 
 {---------------------------------------------------------------------}
 {- G1.3 -}
+{- 
+        g ist leicht veraendert, um Mehrdeutigkeiten zu vermeiden.
+        Original:
+        g :: Integer -> Integer
+        g n = if n < 10 then n*n else n
+-}
+
 g :: Integer -> Integer
-g n = if n < 10 then n*n else n
+g n = if n < 10 then n*n else 2*n
+
 
 max_g :: Integer -> Integer
-max_g n = undefined
+max_g n
+        | n <= 0 = 0
+        | otherwise =
+                if (g x < g n) then n else x
+                where
+                x = max_g (n-1)
+
 
+max_g' :: Integer -> Integer
+max_g' n
+        | n < 0 = 0
+        | n <= 9 = n
+        -- Siehe Aenderung von g
+        | n < 41 = 9
+        | otherwise = n
+
+
+prop_max_g :: Integer -> Bool
+prop_max_g n =
+        max_g n == max_g' n
+
+
+
+{---------------------------------------------------------------------}
 {- Aufgabe H1.1 -}
 {-WETT-} {- Diese Zeile nicht entfernen -}
 sum_max_sq :: Integer -> Integer -> Integer -> Integer
@@ -38,7 +121,6 @@
 
 
 
-
 {---------------------------------------------------------------------}
 {- Aufgabe H1.2 -}