Machen Sie eine Liste der Teiler in Haskell
Ich Tue problem 21 in eulerproject.
Ein Teil erfordert das finden der Liste der ordnungsgemäße Teiler einer Zahl. also wo ist Rest n
und eine Anzahl von weniger als n
. Also machte ich diese Haskell, aber GHCI wird wütend auf mich.
divisors n =[ n | n <- [1..(n-1)], n `rem` [1..(n-1)] ==0 ]
Das problem ist, dass ich nicht wissen, wie zu machen:
n `rem` [1..(n-1)]
so, es gibt nur die Nummer weniger als n
teilen gleichmäßig in n
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nur eine separate variable.
Nun, wenn Sie wollten, um es ein bisschen mehr effizient, wir wissen schon, dass der divisor nicht mehr als die Hälfte der
n
, und wir wissen, 1 ist ein Teiler von allem. Und, lassen Sie uns gehen Sie vor und machen es ein bisschen mehr Haskell-y zu starten, die Vermeidung einer list comprehension:sum $ map sum x
wiesum $ map sum [ [1,2,3], [4,5,6], [7,8,9] ]
was in der 45.sum . concat
, die erste macht eine große Liste.Wenn die Reihenfolge der Liste der Teiler ist nicht wichtig, machen Sie dies deutlich effizienter werden, indem nur die überprüfung Teiler im Bereich [2..sqrt n].
Etwas wie dieses (Sie könnten wahrscheinlich machen einige lokale Optimierungen, wenn Sie sich Gedanken über es mehr):
Wo Teiler der bisherigen Umsetzung und der Teiler " ist die neue:
HINWEIS:
Wir ich verwendet nub zu entfernen, keine Wiederholungen, wenn in der Tat die einzig mögliche Wiederholung wäre limit, wenn n ein Quadrat. Man könnte ihn etwas effizienter Umgang mit diesem Fall besser, aber ich finde, dieser Weg ist besser lesbar (wenn die Laufzeit nicht entscheidend ist).