我在一些评判系统中解决了不同的问题。今天我想用State Monad
计算斐波纳契数。我的代码运行良好,它通过了我所有的测试。但是有一些错误(一个测试失败),我无法确定。
我的代码是:
fib :: Int -> Integer
fib n = fst $ execState (replicateM n fibStep) (0,1)
fibStep :: State (Integer,Integer) ()
fibStep = do modify (\(a, b) -> (b, a + b))
你能帮我找到错误吗?我不知道,错误在哪里。
答案 0 :(得分:4)
我认为您的代码是正确的,使用来自here
的天真实现fib0
进行测试
import Control.Monad.State
fib :: Int -> Integer
fib n = fst $ execState (replicateM n fibStep) (0,1)
fibStep :: State (Integer,Integer) ()
fibStep = do modify (\(a, b) -> (b, a + b))
fib0 0 = 0
fib0 1 = 1
fib0 n = fib0 (n-1) + fib0 (n-2)
我试过了:
*Main> map (\x -> fib x - fib0 x) [1..25]
得到了
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
您的功能似乎与预期的结果相同。