试图将fibonacci函数的回忆录扩展为否定论点。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这并没有帮助,因为部分应用的斐波纳契函数块的列表不是这样预先生成的。
发布于 2015-01-17 03:01:21
你离我很近!
只需进一步提取map语句:
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则相反。
https://stackoverflow.com/questions/27995641
复制相似问题