plaudern.de

Forumsharing?
Forum suchen
Forum erstellen
Impressum/Kontakt
Datenschutz
AGB
Hilfe

30 User im System
Rekord: 483
(01.04.2024, 01:34 Uhr)

 
 
 Haskell :: Sprache
  Suche:

 Blatt 5 25.11.2002 (02:20 Uhr) amo
Hallo,

hier sind mal Lösungsversuche der Aufgaben 2 - 4. Mit den Permutationen der Aufgabe 5 und schlimmen Zahnschmerzen kämpfe ich leider noch.


--------------------------------

module Uebungsblatt_05 where

middle :: [a] -> a
middle xs = xs !! (( div ( length xs + 1 ) 2 ) - 1 )


allEqual :: [Integer] -> Bool
allEqual [] = True
allEqual (x:[]) = True
allEqual (x:y:xs) = x == y && allEqual ( y:xs )


merge :: Ord a => [a] -> [a] -> [a]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
                    | x < y = x : merge xs (y:ys)
                    | otherwise = y : merge (x:xs) ys

mergesort :: Ord a => [a] -> [a]
mergesort xs | length xs <= 1 = xs
             | otherwise = merge ( mergesort (take (length xs `div` 2) xs) ) ( mergesort (drop (length xs `div` 2) xs) )

--------------------------------------

Zu den Permutationen habe ich leider noch nicht die richtige Lösung gefunden.

Für middle sollte man es vielleicht noch hin bekommen, für eine leere Liste als Eingabe eine Fehlermeldung auszugeben, aber das scheitert bei mir bis jetzt an der Typisierung.

Für Ideen zu den Permutationen wäre ich dankbar!
Ok Leute... :-)

Hier nun eine Routine zu den Permutationen in Aufgabe 6. Leider brauchte ich aber 4 Funktionsdefinitionen, um das unter zu bringen. Die Funktion entstand nach einem Vorschlag, einer Idee von Rolf, die er mir gestern in der Bibliothek sagte. Danke dafür!

Hat wer ne Idee, wie man das gut machen kann, wenn man die Permutationen nicht rekursiv aufbaut, sondern [1..n] nimmt und dann systematisch permutiert und die Ergebnisse in eine Liste speichert?

Das hab ich leider nicht hinbekommen *schäm*.


------ Code Anfang

permutations :: Integer -> [[Integer]]
permutations x | x <= 0 = [[]]
permutations 1 = [[1]]
permutations n = addPerm n (permutations (n-1))

addPerm :: a -> [[a]] -> [[a]]
addPerm _ [] = []
addPerm n (x:xs) = addPermElem2Perm n x ++ addPerm n xs

addPermElem2Perm :: a -> [a] -> [[a]]
addPermElem2Perm n xs = addPermElemAfter (length xs) n xs where
   addPermElemAfter 0 n xs = [n:xs]
   addPermElemAfter i n xs = (take i xs ++ [n] ++ drop i xs) : addPermElemAfter (i-1) n xs

------ Code Ende


Viel Spaß beim Ausprobieren.

Das Gute dabei ist, finde ich, daß addPerm auf jedem beliebigen Listentyp arbeiten kann.
permutations ist aber deklariert, wie es in der Aufgabe gefordert war.
Wenn man das nicht so einschränkt, kann man addPerm verwenden, um beliebige Stringpermutationen zu erzeugen. Mit der Reihenfolge der Permutationen bin ich noch nicht zufrieden. Ich fände es schöner, direkt eine Ausgabe zu erzeugen, wie sie von mergesort (permutations n) mit n :: Integer geliefert wird.
Zuletzt geändert von amo am 26.11.2002 um 02:19 Uhr.
 Aufgabe 1 27.11.2002 (22:54 Uhr) amo
Ist das ein Locher?

Bis auf die erste Zeile könnte es ein Mathematiker sein.

Dies ist ein Beitrag aus dem Forum "Haskell". Die Überschrift des Forums ist "Haskell :: Sprache".
Komplette Diskussion aufklappen | Inhaltsverzeichnis Forum Haskell | Forenübersicht | plaudern.de-Homepage

Kostenloses Forumhosting von plaudern.de. Dieses Forum im eigenen Design entführen. Impressum



Papier sparen durch druckoptimierte Webseiten. Wie es geht erfahren Sie unter www.baummord.de.