2009-10-11 5 views
0

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 en n
  • sf (n) est la somme des chiffres du résultat de f (n)
  • g (i) est la plus petite solution entière pour sf (i). Comme il peut y avoir beaucoup de résultats pour sf (i)
  • sg (i) est la somme des chiffres dans le résultat de g (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.

+2

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. –

+1

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

+0

@Chris Lutz: vous avez raison. c'était une faute de frappe – yairchu

Répondre

2

Le problème de mémoire peut se trouver dans decToList ou fac.

je l'ai couru avec

fac = product . enumFromTo 1 
decToList = map (read . return) . show 
main = print answer 

Et ce ne sont pas venus près de sucer toute ma RAM, il n'a pas fini, cependant. Btw: Je suspecte un problème Euler de projet avancé d'être plus dur que cela. donc cet algorithme ne le fera pas.

+0

Les fonctions factorielle et décimale de la liste dans ce problème sont triviales je suppose, à moins que la valeur de g (i) devienne incroyablement grande. Mais cela semblait si simple! Je demanderai peut-être à mes professeurs de maths et à ce professeur de chimie qui est aussi un as en science informatique demain. –

+0

@Jonno_FTW: Même si elles sont triviales, pour déboguer un bug mystérieux, on a besoin de l'image complète – yairchu