具有条件的记忆功能?

时间:2015-01-17 02:40:18

标签: haskell memoization

尝试为负面参数扩展memoizing fibonacci函数。 贝娄是一个代码,它只能用正值来实现:

fib :: Integer -> Integer
fib = (map fib' [0..] !!) . fromInteger
    where
    fib' 0        = 0
    fib' 1        = 1
    fib' n        = (fib $ n-2) + (fib $ n-1)
    negfib' 0     = 1
    negfib' 1     = -1
    negfib' n     = (fib $ n+2) - (fib $ n+1)

如何更改fib定义,以便在使用负数调用时,还会使用negfib'缓存结果?

尝试使用图案防护装置

fib n
    | n>= 0     = (map fib' [0..] !!) . fromInteger $ n
    | otherwise = (map negfib' [0..] !!) . fromInteger $ -n - 1

或括在lambda函数中

fib = (\n -> if n >= 0
                 then map fib' [0..] !!) . fromInteger $ n
                 else map negfib' [0..] !!) . fromInteger $ -n - 1

没有帮助,因为部分应用的fibonnaci函数thunks的列表不是以这种方式预先生成的。

1 个答案:

答案 0 :(得分:3)

你非常接近!

进一步拉出地图陈述:

fib = lookup
  where fibs = map fib' [0..]
        negfibs = map negfib' [0..]
        lookup n | n >= 0    = (fibs !!) . fromInteger $ n
                 | otherwise = (negfibs !!) . fromInteger $ -n - 1

现在fibsnegfibs的定义只发生一次(使用fib的定义),而不是每个n