www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Verstehnix

Gepostet:
07.05.2009 11:12

List Comprehension  
Hallo,

ich habe ein Problem mit einer Uni-Aufgabe bzgl Haskell.

Komme mit der Haskell Syntax zum Teil leider noch nicht so richtig klar.
Und zwar geht es um list comprehension, dabei konnte ich alle Aufgaben bis auf folgende lösen, welche von der Punktevergabe EIGENTLICH eher einfach sein sollte=)


Die unendliche Liste aller natürlichen Quadratzahlen, die durch 5 ohne Rest teilbar sind, aber
nur mit Rest durch 20 teilbar sind

Meine Idee war einfach folgende:

[ x*x| x <- [1..], mod x 5 == 0 && mod x 20 /= 0]


Im Endeffekt ist die Ausgabe allerdings nur eine Liste die das mod x 5 == 0 berücksichtigt, der andere Aspekt wird ignoriert.
Eine Liste mit den ersten 10 Elementen sieht also bei mir so aus:
[25,100,225,625,900,1225,2025,2500,3025,4225]

Würde mich sehr freuen, wenn mir jemand erklären könnte, was ich da mal wieder nicht verstanden habe=)
Zum Seitenanfang    
 
harrib

Gepostet:
08.05.2009 14:30

   
Hallo Verstehnix

wenn ich x*x für die Quadratzahl verwende

take 10 [ x*x| x <- [1..], x*x `mod` 5 == 0 && x*x `mod` 20 /= 0]

erhalte ich

[25,225,625,1225,2025,3025,4225,5625,7225,9025]


Viele Grüße
Harri
Zum Seitenanfang    
 
Luks

Gepostet:
06.11.2009 00:30

   
hey leute, bin neu hier und hab aufgabe:
Definieren Sie eine Haskell-Funktion
remDuplicates:: Eq a => [a] -> [a],
die Mehrfachvorkommen von Elementen aus Listen entfernt, aber ansonsten die Reihenfolge der Element beibehält.
· Variante 1 (remDuplicates): Bei Mehrfachvorkommen soll das letzte Vorkommen in der Ergebnisliste erhalten bleiben.
· Variante 2 (remDuplicates'): Bei Mehrfachvorkommen soll das erste Vorkommen in der Ergebnisliste erhalten bleiben.

Variante 1 hab ich hinbekommen, aber bei Variante 2 komm ich irgendwie nicht weiter...


remDuplicates' :: Eq a => [a] -> [a]
remDuplicates' [] = []
remDublicares' [a] = [a]
remDublicares' [x,y] |x==y =[y]
remDublicares'(x:y:xs) = filter (=x) (y:xs)
-- x:(remDublicares' (y:xs))

filter :: (a -> Bool) -> [a] -> [a]
filter p [] = []
filter p (x:xs) = if p x then filter (p xs)
else x:(filter (p xs))


kann mir irgendwer vllt. helfen?
DANKE!!!
Zum Seitenanfang    
 
Siracusa

Gepostet:
08.11.2009 17:52

   
Hallo,

wenn es keine Einschränkungen bzgl. der Performance der Funktion gibt, könntest du ein wenig tricksen: Du nimmst dir die Eingabeliste, drehst die Reihenfolge der Elemente um (mit Funktion reverse), wendest die Funktion remDublicates an und drehst das Ergebnis davon wieder um. Müsste eigentlich funktionieren. Smilie

PS: Nächstes Mal bitte bei einer neuen Aufgabe auch einen neuen Thread anlegen.


Viele Grüße,

Siracusa
Zum Seitenanfang