我需要计算foo n = maximumBy (comparing p) [1..n]
,哪里p :: Int -> Int
慢。但我知道这一点p n < n
,n > 0
并希望使用这个事实来加速这个计算,方法如下:我从down to开始计算p x
,记住当前的最大值。一旦我达到小于或等于当前最大值的值,我就知道这个最大值必须是全局最大值,我就完成了。x
n
1
x
所以我的尝试看起来像这样:
foo n = go (0, 0) n where
go (c, _) 1 = c
go (c, c') !x = if c' >= x then c else go (c2, c'2) (x-1) where
x' = p x
(c2, c'2) = if c' >= x' then (c, c') else (x, x')
这有效,但看起来不是很地道。所以我正在寻找一个更优雅的解决方案。你有什么建议吗?