Haftungsausschluss: Ich bin neu bei Haskell und ich erinnere mich nicht viel über FP von der Universität, also kann es mehr als ein oder zwei Fehler in meinem Code geben. Dies ist auch mein Code für Euler Problem 3.Haskell: Rekursion mit Array-Argumenten
Ich versuche, eine Funktion mit zwei Arrays als Argumente und ein Array als Ergebnis rekursiv aufzurufen.
Das Ziel:
- n annehmen 10 für diese Frage
- eine Liste aller natürlichen Zahlen von 1 bis n erstellen (Variable 'allNumbers' ist Code)
- erstellen eine weitere Liste von alle natürlichen Zahlen von 1 bis n (Variable ist 'allFactors' ist Code)
- nimm das erste Element in 'allFactors' und multipliziere den Rest der Anzahl von 'allFactors' mit dieser Zahl. (dies erzeugt ein Array von Zahlen)
- entfernen Sie alle diese Nummern von 'allNumbers'
- fahren Sie von 1 bis n fort, bis 'allFactors' leer ist.
Hier ist mein Code:
mkList :: Int -> [Int]
mkList n = [1..n-1]
modArray :: Int -> Int -> [Int]
modArray a b = [ x*b | x <- [1..a], x `mod` b == 0]
modArrayAll :: [Int] -> [Int] -> [Int]
modArrayAll [] [] = []
modArrayAll (x:xs) (y:ys) = (e)
where
m = head(ys)
n = length(xs)
e = (modArrayAll xs ys) \\ modArray n m
(in Haupt)
let allNumbers = mkList (first + 1)
let allFactors = mkList (first + 1)
let mainList2 = modArrayAll allNumbers allFactors
Dies in einer Null-Liste führt. Allerdings, wenn ich habe:
e = xs \\ modArray n m --WORKS for one iteration
ich die ungeraden Zahlen alle bekommen von 1 bis 10.
Meine Frage: Warum ist das nicht die Art und Weise arbeiten würde ich es erwarten? Ich würde erwarten, dass der rekursive Stack die leere Array-Bedingung treffen würde und einfach ein leeres Array zurückgeben würde, das nicht aus dem aufrufenden Array entfernt würde, und es würde nur die Primzahlen zurückgeben?
Danke für die Rückmeldung. Was ich will, sind alle Primfaktoren von 'n'. Ich habe einen anderen Algorithmus in Python ausprobiert. Also, ich bin nicht ganz sicher, wie man das in Haskell (es ist schon eine Weile) – cbrulak
Vielen Dank für das Feedback. Ich habe meinen Code neu geschrieben und ich denke, es ist besser. – cbrulak