题解 P1720 【月落乌啼算钱】
HoshinoTented
2019-01-28 16:04:32
# 先说几句
其他的题解都说的很清楚了, 是斐波那契数列
~~但都没有Haskell的题解~~
# [题解(Haskell)](https://github.com/HoshinoTented/LuoGu/blob/master/src/P1720.hs)
```haskell
fibNext :: (Int, Int) -> (Int, Int)
fibNext (a, b) = (b, a + b)
fib :: Int -> Int
fib n = fst (iterate fibNext (0, 1) !! n)
main :: IO ()
main = do
n <- read <$> getLine :: IO Int
putStrLn $ show (fib n) ++ ".00"
return ()
```
关于这个斐波那契数列的计算方式, 是从 《Haskell函数式编程入门》 里学来的
`fibNext` 接收一个 `(Int, Int)`, 将第二项作为返回值的第一项, 将一二项之和作为返回值的第二项
再用 `iterate` 生成一个无限的斐波那契数列, 看起来是这样子的:
```
[(0,1),(1,1),(1,2),(2,3),(3,5),(5,8),(8,13),(13,21), ...]
```
之后只需要取出对应下标的 `(Int, Int)`, 使用 `fst :: (a, b) -> a` 取出第一项就可以了