Gepostet: |
Hamming numbers. | ||||||||||
Guten Abend! Also, ich will eine Funktion "hamming :: [Int]" mit Hilfe einer anderen Funktion "factors" definieren. Die hamming-Funktion soll eine unendliche Liste von hamming numbers erzeugen. Beispiel: [1,2,3,4,5,6,8,9,10,12.. Ich hab die Funktion factors so geschrieben, es war nicht so schwierig factors :: Int -> [Int] factors x = [n | n <- [1..x], x `mod` n == 0] Und jetzt weiß ich nicht genau, wie ich die neue Funktion definieren muss. Also, vielleicht wieder mit einer Listenkomprehension. z.B. hamming :: [Int] hamming = [x|x<-[1..], factrors x /diese Stelle hier ist ein bisschen problematisch für mich/.. Ich hab gelesen, dass man die Funktion so schreiben kann: hamming :: [Integer] hamming = 1 : merge (map (2*) hamming) (merge (map (3*) hamming) (map (5*) hamming)) merge :: (Ord a) => [a] -> [a] -> [a] merge (x:xs)(y:ys) | x == y = x : merge xs ys | x < y = x : merge xs (y:ys) | otherwise = y : merge (x:xs) ys Danke im Voraus für die Hilfe! mfG, iLeeT |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, also ich denke du müßtest dir statt einer Funktion factors, eher eine Funktion primeFactors schreiben, die alle Primfaktoren für eine Zahl berechnet. Dann brauchst du nur zu schauen, ob nur 2, 3 oder 5 in der Liste vorkommen und hast so bestimmt, ob die Zahl eine Hamming-Zahl ist. Den Test auf die Hamming-Zahl kannst du dann so machen: isHammingNumber :: Int -> Bool \\ ist in Data.List definiert und stellt die Mengendifferenz dar, also x \\ y bspw. löscht alle Elemente der Liste y aus der Liste x. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Vielen Dank für die Hilfe! Aber leider hab ich das noch nicht richtig gemacht. Also, ich schreibe die primeFactors Funktion und teste Es kommt das raus.. Main> isHammingNumber 4 False Und das stimmt aber nicht, weil 4 eine Hamming-Zahl ist. Vielleicht muss ich noch eine Funktion schreiben, die die Duplikate aus der von primeFactors erzeugten Liste löscht? Und noch ne Frage. Wie kann ich das machen ohne etwas zu importieren, weil es mir nicht erlaubt ist, das zu machen. Und in der Aufgabenstellung steht, dass ich die Funktion factors nutzen muss.. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
factors :: Int -> [Int] factors n = [ x | x <- [1..n], n `mod` x == 0] isHamming :: Int -> Bool isHamming n = [ x | x <- factors n, x `mod` 2 /= 0, x `mod` 3 /= 0, x `mod` 5 /= 0] == [1] hamming :: [Int] hamming = [x | x<-[1..], isHamming x] -- oder filter isHamming [1..] lg |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Vielen Dank! Jetzt hab ich es verstanden :) | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
mein Vorschlag hamming :: [Int] hamming = 1 : [ i | i <- [1..], factors i [2,3,5]] where factors :: Int -> [Int] -> Bool factors _ [] = False factors i (k:r) = (mod i k == 0) || (factors i r) |
|||||||||||
Zum Seitenanfang | |||||||||||