Funktionale Programmierung Übungsblatt 8

Werbung
Funktionale Programmierung
Institut für Programmiermethodik und Compilerbau
Dr. Walter Guttmann
Übungsblatt 8
2011.12.14
Aufgabe 63:
Gib Instanzen der Typklasse Show für den Datentyp RoseTree und den erweiterten Datentyp AExp von Übungsblatt 7 an.
Aufgabe 64:
Eine Zahl heißt perfekt, falls sie die Summe ihrer echten, positiven Teiler ist. Berechne
die unendliche Liste der perfekten Zahlen mit Hilfe von Listenkomprehensionen.
Aufgabe 65:
Implementiere die Funktion omm :: [a] -> [a], die die Elemente ihres Arguments der
Reihe nach wiederholt. Zum Beispiel ist omm [1,2,3] = [1,2,3,1,2,3,1,2,3,....
Aufgabe 66:
Definiere die Funktion uniq :: Eq a => [a] -> [a], die in endlichen und unendlichen
Listen aufeinanderfolgende Duplikate durch einzelne Vorkommen ersetzt. Beispielsweise
sind uniq "1223334444333221" = "1234321" und uniq (omm [1,1,2,2,1]) = omm [1,2].
Aufgabe 67:
Definiere die Funktion quersumme :: Integer -> Integer zur Berechnung der Quersumme einer Zahl. Durch wiederholte Anwendung kann die einstellige Quersumme gebildet
werden. Verwende iterate zur Definition der Funktion quers :: Integer -> Integer,
die das leistet.
Berechne die unendliche Liste der einstelligen Quersummen aller Primzahlen. Berechne
mit Hilfe von scanl wie oft jede einstellige Quersumme in jedem Präfix dieser Liste vorkommt. Der dazu erforderliche Zähler kann beispielsweise als zehnelementige Liste oder
als Funktion des Typs Integer -> Integer mit Urbild {0, . . . , 9} implementiert werden.
Führe dasselbe für die Fibonaccizahlen aus.
Aufgabe 68:
Die Funktion mergeAll :: Ord a => [[a]] -> [a] bekommt als Parameter eine unendliche Liste xss, deren Elemente ihrerseits aufsteigend sortierte, unendliche Listen sind. Die
Kopfelemente der Listen in xss, die man etwa durch map head xss erhält, sind ebenfalls
aufsteigend sortiert. Die Funktion liefert die aufsteigend sortierte Liste aller Elemente
aus allen Listen in xss. Gib eine Definition von mergeAll an, die mehrfache Vorkommen
von Elementen beibehält, und eine, die sie durch einzelne Vorkommen ersetzt.
Welche Änderungen sind erforderlich, damit mergeAll auch für endliches xss und/oder
endliche Listen in xss korrekt arbeitet?
Definiere die aufsteigend sortierte Liste aller Primzahlpotenzen.
Aufgabe 69:
Implementiere die folgenden Abwandlungen der Hammingfolge:
(a) Die Funktion hamming1 :: Integer -> Integer -> Integer -> [Integer] erwartet drei Zahlen a, b und c als Parameter, die anstatt 2, 3 und 5 verwendet werden.
Es kommen also die Vielfachen ax, bx und cx in die Folge, falls x enthalten ist.
Gehe davon aus, daß a, b, c > 1 ist. Damit gilt etwa
hamming = hamming1 2 3 5
(b) Die Funktion hamming2 :: [Integer] -> [Integer] erhält eine endliche Liste von
Zahlen ai als Parameter, die anstatt 2, 3 und 5 verwendet werden. Falls x in der
Folge ist, kommen also alle Vielfachen ai x ebenfalls in die Folge. Gehe davon aus,
daß ai > 1 ist. Damit gilt etwa
hamming1 a b c = hamming2 [a,b,c]
(c) Die Funktion hamming3 :: [Integer] -> [Integer] -> [Integer] erhält zusätzlich eine aufsteigend sortierte, endliche oder unendliche Liste von Zahlen, die anstatt
1 als Startwerte verwendet werden. Alle Elemente dieser Liste sind also in der Folge.
Damit gilt etwa
hamming2 as = hamming3 as [1]
Aufgabe 70:
Gib die Funktion transpose :: [[a]] -> [[a]] zur Transposition (endlicher) Matrizen
als Instanz von foldr an. Für den Terminierungsfall ist die Funktion repeat hilfreich.
Funktioniert die Implementierung auch für unendliche Matrizen?
Herunterladen