www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

iLeeT

Gepostet:
17.01.2009 21:41

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    
 
Siracusa

Gepostet:
18.01.2009 00:57

   
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
isHammingNumber n = ((primeFactors n) \\ [2,3,5]) == []

\\ 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    
 
iLeeT

Gepostet:
18.01.2009 02:05

   
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    
 
xlucky

Gepostet:
18.01.2009 11:17

   
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    
 
iLeeT

Gepostet:
18.01.2009 13:45

   
Vielen Dank! Jetzt hab ich es verstanden :)
Zum Seitenanfang    
 
david

Gepostet:
05.03.2009 23:07

   
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