尝试为负面参数扩展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的列表不是以这种方式预先生成的。
答案 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
现在fibs
和negfibs
的定义只发生一次(使用fib
的定义),而不是每个n
。