Pracuję nad projektem Euler Problem 14. Oto moje rozwiązanie.Dlaczego to wyrażenie Haskella jest takie wolne?
import Data.List
collatzLength :: Int->Int
collatzLength 1 = 1
collatzLength n | odd n = 1 + collatzLength (3 * n + 1)
| even n = 1 + collatzLength (n `quot` 2)
maxTuple :: (Int, Int)->(Int, Int)->Ordering
maxTuple (x1, x2) (y1, y2) | x1 > y1 = GT
| x1 < y1 = LT
| otherwise = EQ
biegnę następujące z GHCi
maximumBy maxTuple [(collatzLength x, x) | x <- [1..1000000]]
wiem, że jeśli Haskell ocenia surowo, czas na to byłoby coś podobnego O (n). Ponieważ Haskell ocenia leniwie, wydaje się, że powinno to być ciągłe wielokrotne n. To trwa już prawie godzinę. Wydaje się bardzo nierozsądne. Czy ktoś ma jakiś pomysł, dlaczego?
nie widzę dlaczego lenistwo Haskell powinna żadnej różnicy na złożoność tego algorytm. – sepp2k
Twoja funkcja 'collatzLength' nie jest rekursywna. Spowalnia to funkcję i powoduje niepotrzebne przydzielanie. A twoje 'maxTuple' jest takie samo jak' porównywanie fst'. – fuz
@sepp Naprawdę nie wiem, w jaki sposób implementuje się rozumienie list. Jeśli używają mapy, jeśli Haskell jest oceniany ściśle, wydaje się, że musiałby przejść przez listę wiele razy. –