有条件的记忆功能吗?

戴维·恩里克

尝试扩展用于否定参数的记忆斐波那契函数。贝娄(Bellow)是一种代码,仅可使用正值:

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

这样做没有帮助,因为部分应用的斐波那契功能分类的列表不是通过这种方式预先生成的。

暴行

你很亲密!

只需将map语句进一步拉出:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章