Я попытался решить задачу 443 на ProjectEuler, https://projecteuler.net/problem=443.Почему моя программа haskell слишком медленная?
Чтобы найти образец г, я просто реализован г в Haskell, как
g::Int->Int
g 4=13
g n=g (n-1)+n `gcd` g(n-1)
Но вычисляя список t=[g i|i<-[4..100]]
занимает гораздо больше, чем на 1 секунду. Почему это происходит? Даже без воспоминаний для каждого g (n) требуется только O (n).
Редактировать: когда я пробовал этот код в ideone, все в порядке, но на моем компьютере это не так. Это проблема с версией haskell? Я использую версию ghc 7.8.3 для Windows, тогда как ideone использует ghc 7.6.
Почему мой код не memoizied? Только моя догадка haskell пыталась вычислить g параллельно, поэтому требуется экспоненциальное время. Это правильно? – Maddy
Зачем? Вы не написали код для напоминания. – Bergi
@Maddy Это распространенное, но непонятное, неправильное представление о том, что Haskell автоматически запоминает. Никакой другой язык (точнее: компилятор). Я знаю об этом, и Haskell (GHC) не так сильно отличается, как многие статьи могут заставить вас поверить. –