Я начинаю работать с функциональными языками, и я стараюсь, чтобы все это произошло в Haskell. Вот быстрая и грязная функция, которая находит все факторы ряда:Проблемы с функциональным обучением
factors :: (Integral a) => a -> [a]
factors x = filter (\z -> x `mod` z == 0) [2..x `div` 2]
работает отлично, но я нашел, что это невыносимо медленно для больших чисел. Так что я сделал себе получше:
factorcalc :: (Integral a) => a -> a -> [a] -> [a]
factorcalc x y z
| y `elem` z = sort z
| x `mod` y == 0 = factorcalc x (y+1) (z ++ [y] ++ [(x `div` y)])
| otherwise = factorcalc x (y+1) z
Но вот моя проблема: Несмотря на то, что код работает, и может сократить буквально час от времени выполнения моих программ, это отвратительных!
Это пахнет уродливым императивным мышлением: он постоянно обновляет счетчик и структуру данных в цикле до тех пор, пока он не завершится. Поскольку вы не можете изменить состояние в чисто функциональном программировании, я обманул, удерживая данные в параметрах, которые функция просто передает себе снова и снова.
Может быть, я ошибаюсь, но там просто должен быть лучший способ сделать то же самое ...
Хорошо, как медленно? –