Je suis en train de faire problème 254 dans le projet euler et sont arrivés à cet ensemble de fonctions et refactor dans Haskell:Optimisations pour une série de fonctions dans Haskell
f n = sum $ map fac (decToList n)
sf n = sum $ decToList (f n)
g i = head [ n | n <- [1..], sf n == i]
sg i = sum $ decToList (g i)
answer = sum [ sg i | i <- [1 .. 150] ]
Où:
f (n)
découvertes la somme des factorielles de chaque chiffre enn
sf (n)
est la somme des chiffres du résultat def (n)
g (i)
est la plus petite solution entière poursf (i)
. Comme il peut y avoir beaucoup de résultats poursf (i)
sg (i)
est la somme des chiffres dans le résultat deg (i)
Mais pas longtemps en exécutant la version compilée de ce script, il aspiré toute ma RAM. Existe-t-il un meilleur moyen d'implémenter la fonction g (i)
? Si oui, que peuvent-ils être et comment pourrais-je y aller?
EDIT:
Juste de clarté, mes fonctions pour:
fac
est:
`fac 0 = 1`
`fac n = n * fac (n-1)`
decToList
qui fait un numéro dans une liste:
decToList1 x = reverse $ decToList' x
where
decToList' 0 = []
decToList' y = let (a,b) = quotRem y 10 in [b] ++ decToList' a
Bien que Je l'ai fait depuis les mettre à jour à la solution de Yairchu f ou d'optimisation.
Je ne connais pas très bien Haskell, mais votre dernière ligne de code a des parenthèses incompatibles, ce qui est presque toujours une faute de frappe. –
Salut, c'est Euler ** 254 **, donc je ne m'attendrais pas à ce que l'algorithme de force brute fonctionne. Cependant, je ne peux pas imaginer un algorithme plus intelligent jusqu'à présent. Mon programme a duré plus d'une heure mais n'a toujours pas obtenu g (50). – pierrotlefou
@Chris Lutz: vous avez raison. c'était une faute de frappe – yairchu