を計算する必要がありますがfoo n = maximumBy (comparing p) [1..n]
、p :: Int -> Int
遅いです。しかし、私はそれp n < n
をすべて知っておりn > 0
、この事実を使用してこの計算を次のように高速化したいと考えています。現在の最大値を記憶して、から始めて計算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')
これは機能しますが、あまり慣用的には見えません。だから私はもっとエレガントな解決策を探しています。提案はありますか?