Gepostet: |
Arbeiten mit unendlichen Listen | ||||||||||
Hi, ich habe zwei Funktionen geschrieben, die mir 2 Arten von unendlichen Listen erzeugen. Zum einen fromN :: Integer -> [Integer] fromN n = [n..] und fromNM :: Integer -> Integer -> [Integer] fromNM n m = [n, m..] Da hört's dann mit meinem Können aber auch schon auf. Ich soll jetzt 1. eine Funktion summ :: [Integer] -> [Integer] schreiben, die für eine unendliche Liste die Liste der Summen benachbarter Zahlen als unendliche Liste zurückgibt. 2. einen Wert oneZero :: [Interger] definieren, welcher die Liste repräsentiert, die mit eins anfängt und dann undendlich viele Nullen enthält. 3. eine Funktion dropDivN :: Int -> [Integer] -> [Integer] schreiben, welche aus einer undendlichen Liste von Zahlen alle entfernt, die durch die übergebene Zahl n teilbar sind. 4. die Funktion dropDivN verwenden, um nach dem Prinzip des "Sieb des Eratosthenes" den Wert primes :: [Integer] zu definieren, der die undendliche Liste aller Primzahlen darstellt. Ich sitze bestimmt schon 2 Stunden an dem Kram, ohne auch nur den Funken eines Ansatzes hinzubekommen. Wäre schön, wenn mir jemand hilft. Danke. Liebe Grüße |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, woran scheitert es denn, an der Syntax oder dem Algorithmus? Die Funktionen zu 1.) und 2.) sind ja recht einfach, bei 1.) holst du dir die ersten beiden Elemente der Liste durch Musteranpassung und hängst die Summe von beiden an die rekursiv berechnete Restliste. 2.) kannst du über List Comprehensions erzeugen, oder mittels fromNM. 3.) wäre auch nicht so schwierig, wenn du durch die Liste läufst und für jedes Element die Teilbarkeit bestimmst, und, sofern es nicht teilbar ist, das Originalelement wieder in die Ergebnisliste nimmst, andernfalls einfach weglässt. 4.) wird dann etwas kniffliger. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Mal aus der Hüfte: 1) summ xs = zipWith (+) xs (tail xs) 2) oneZero = 1 : [0,0..] 3) dropDivN n xs = filter (\x -> x `mod` n /= 0) xs 4) primes' = eratos [2,3..] where eratos (p:ps) = p : eratos (dropDivN p ps) Wie immer gilt: Hoogle ist dein Freund. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
zu oneZero | ||||||||||
Hi, wir mussten die gleichen Funktionen mal schreiben, ich habe die oneZero damals in zwei funktionen geschrieben. zero :: [Integer] zero = 0 : zero oneZero :: [Integer] oneZero = 1 : zero viele Grüße Matthias |
|||||||||||
Zum Seitenanfang | ICQ | ||||||||||
Gepostet: |
|||||||||||
Deine Version ist korrekt, aber ich finde
lesbarer. Dafür gibt es ja die spezielle Listen-Syntax. Insgesamt gibt es in Haskell einen starken Hang dazu, die Rekursion eingebauten Funktionen zu überlassen. Eine andere Version könnte man mit der Funktion iterate realisieren:
Ich sehe gerade, dass man bei der dritten Frage auch kürzer
schreiben kann, aber ob das lesbarer ist, sei dahingestellt |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
> dropDivN :: Int -> [Integer] -> [Integer] > dropDivN n = filter (/= 0).(`mod` n) Das klappt so aber nicht, da fehlt entweder ein map hinten (filter (/= 0) . map (`mod` n)) oder eine zusätzliche Klammerung (filter $ (/= 0) . (`mod` n)). Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Stimmt, es sollte dropDivN n = filter ((/= 0).(`mod` n)) heißen (oder halt mit $). |
|||||||||||
Zum Seitenanfang | |||||||||||