# HG changeset patch # User Markus Kaiser # Date 1360183725 -3600 # Node ID 15e527f4b92e5a13d97bb2b00be4149228ee6cc8 # Parent 89feab98266f8484005b7799bfe01348033f548d add some more examples to G14.2 (thanks Tobi) diff -r 89feab98266f -r 15e527f4b92e exercises/src/Exercise_14.hs --- a/exercises/src/Exercise_14.hs Tue Feb 05 22:12:07 2013 +0100 +++ b/exercises/src/Exercise_14.hs Wed Feb 06 21:48:45 2013 +0100 @@ -56,20 +56,61 @@ {---------------------------------------------------------------------} {- Aufgabe G14.2 -} +-- Beispiele zur Endrekursion +sum1 :: Int -> Int +sum1 0 = 0 +sum1 n = n + sum1 (n - 1) +{- +sum1 3 = 3 + sum1 2 + sum1 2 = 2 + sum1 1 + sum1 1 = 1 + sum1 0 + sum1 0 = 0 + sum1 1 = 1 + 0 + = 1 + sum1 2 = 2 + 1 + = 3 +sum1 3 = 3 + 3 + = 6 +-} + +sum2 :: Int -> Int +sum2 = sum2_end 0 + where + sum2_end acc 0 = acc + sum2_end acc n = sum2_end (acc + n) (n - 1) +{- +sum2 3 = sum2_end 0 3 + = sum2_end 3 2 + = sum2_end 5 1 + = sum2_end 6 0 + = 6 + +-} + + +-- Concats +-- Nicht Endrekursiv concat' :: [[a]] -> [a] concat' [] = [] concat' (xs:xss) = xs ++ concat' xss - +-- O(n) concat'' :: [[a]] -> [a] -concat'' xss = go [] (reverse xss) +concat'' yss = go [] (reverse yss) where go acc [] = acc go acc (xs:xss) = go (xs ++ acc) xss - +-- O(n^2) concat''' :: [[a]] -> [a] -concat''' = foldr (++) [] +concat''' = go [] + where + go acc [] = acc + go acc (xs:xss) = go (acc ++ xs) xss + +-- Mit Fold +concat'''' :: [[a]] -> [a] +concat'''' = foldr (++) []