Оптимизации для ряда функций в Haskell - PullRequest
0 голосов
/ 11 октября 2009

Я пытаюсь выполнить задачу 254 в Project Euler и пришел к этому набору функций и рефакторинг в 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] ]

Где:

  • f (n) находит сумму факториалов каждой цифры в n
  • sf (n) - сумма цифр в результате f (n)
  • g (i) - наименьшее целочисленное решение для sf (i). Как может быть много результатов для sf (i)
  • sg (i) - сумма цифр в результате g (i)

Но вскоре после запуска скомпилированной версии этого скрипта, он высосал всю мою оперативную память. Есть ли лучший способ реализовать функцию g (i)? Если так, что они могут быть и как я могу это сделать?

EDIT:

Просто для ясности, мои функции для:

fac:

`fac 0 = 1`

`fac n = n * fac (n-1)`

decToList, который превращает число в список:

decToList1 x = reverse $ decToList' x
where
decToList' 0 = []
decToList' y = let (a,b) = quotRem y 10 in [b] ++ decToList' a

Хотя с тех пор я обновил их до решения Yairchu для оптимизации.

1 Ответ

2 голосов
/ 11 октября 2009

Проблема с памятью может лежать в decToList или fac.

Я запустил его с

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

И это не подходило к тому, чтобы высосать всю мою оперативную память, но не закончилось.

Кстати: я подозреваю, что продвинутая проблема Эйлера проекта сложнее, чем эта. следовательно, этот алгоритм не подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...