Я пытаюсь выполнить задачу 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 для оптимизации.