Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

Angabe A11-2

Programm Skelett für Aufgabe A11-2 "Parallele Berechnung"

Haskell source code icon A11-2_Angabe.hs — Haskell source code, 2 KB (2687 bytes)

Dateiinhalt

-- GpH
-- import Control.Parallel   
-- STM
-- import Control.Concurrent 
-- Par-Monad (zuvor "cabal install monad-par" ausführen)
-- import Control.Monad.Par


difficulty  =     0  -- Erhöhen oder verringern Sie diesen Wert, um eine Gesamtlaufzeit von ca. 1.5 Minuten zu erhalten
hanoiHeight =    26  + difficulty
cseqLength  =   558  + difficulty
fibNumber   =    44  + difficulty
fakNumber   = 11111  + difficulty

main = main0
-- main = main1 
-- main = main2 
-- main = main3 

main0 = do  
  putStrLn "Für eine Klausur ist es wirklich wichtig zu wissen, dass:"
  putStrLn $ " * Die " ++ (show fibNumber) ++ ". Fibonacci-Zahl " ++ 
                                            (show $ fib' fibNumber) ++ " lautet."
  putStrLn $ " * Ein Hanoi-Turm der Höhe " ++ (show hanoiHeight) ++ " genau " ++
    (show $ length $ hanoi hanoiHeight 1 3) ++ " Schritte zum Versetzen braucht."
  putStrLn $ " * Die Zahl " ++ (show $ numberWithCSequenceLength cseqLength) ++ 
    " genau " ++ (show cseqLength) ++ " Collatz-Schritte von der 1 entfernt ist."
  putStrLn $ " * Die Fakultät von " ++ (show fakNumber) ++ " eine Zahl mit " ++ 
    (show $ numberLength $ fakultät $ fromIntegral fakNumber) ++ " Stellen ist."
  putStrLn "Oder etwa nicht?"
    
main1 = -- STM Variante benötig die wenigsten Änderungen, wenn uns die Ausgabereihenfolge egal ist.
  undefined -- TODO

main2 = --GPH
  undefined -- TODO
  
main3 = --Par-Monade
  undefined -- TODO
  
  
---------------------------------------------------------- 
-- Alte bekannte Hilfsfunktionen, nicht zu verändern:
    
hanoi :: Int -> Int -> Int -> [(Int,Int)]          
hanoi 1 i j = [(i,j)]
hanoi n i j = 
       hanoi n' i otherTower
    ++ [(i,j)] 
    ++ hanoi n' otherTower j
  where
    n'         = n-1
    otherTower = 1+2+3-i-j

fib' :: Int -> Int    
fib' 0 = 0 -- deutlich langsamer als fib
fib' n 
  | n <= 1    = 1
  | otherwise = fib' (n-1) + fib' (n-2)
    
fibs :: [Integer]
fibs  =  1 : 1 : (zipWith (+) fibs (tail fibs))

fib :: Int -> Integer
fib n  =  fibs !! n        

fakultät :: Integer -> Integer
fakultät n = product [1..n]

numberLength :: Integer -> Int
numberLength x = length $ show x
        
collatzStep :: Integer -> Integer
collatzStep n 
  | even n    = n `div` 2
  | otherwise = 3*n+1
  
collatzLength :: Integer -> Integer
collatzLength n 
  | n < 2     = 1
  | otherwise = 1 + (collatzLength $ collatzStep n)
  
numbersWithCSequenceLength :: [(Integer,Integer)]
numbersWithCSequenceLength = [ (n,collatzLength n) | n<-[1..] ]
  
numberWithCSequenceLength :: Int -> Integer
numberWithCSequenceLength maxL = fst $ head $ dropWhile (\(x,l) -> l < fromIntegral maxL) numbersWithCSequenceLength 

Artikelaktionen

abgelegt unter:

Funktionsleiste