所以我需要创建一个描述为
的函数invFib :: Integer -> Maybe Integer
采用整数并在斐波那契序列中查找(如下面函数所述)
fibs :: [Integer]
fibs = 0:1:(zipWith (+) fibs (tail fibs))
并返回数字示例的索引:
invFib 0
〜> Just 0
invFib 1
〜> Just 1
或Just 2
map invFib [54, 55, 56]
〜> [Nothing,Just 10,Nothing]
invFib (fibs !! 99)
〜> Just 99
我尝试创建一个函数,它接受整数列表并吐出索引,但它仍然失败。有什么想法吗?
这是我试过的功能 -
findNum :: [Integer] -> Integer -> Integer -> Integer
findNum x:xs y z = if x == y
then z
else findNum xs y (z+1)
编辑: 该函数冻结在不在斐波那契序列中的数字,也只在输入1时显示1个值
invFib :: Integer -> Maybe Integer
invFib n = if n < 0
then Nothing
else fmap fromIntegral (elemIndex n fibs)
答案 0 :(得分:8)
所以关键在于fibs
是无限的,但单调增加。因此,一旦超过所寻找的数量,它就可以返回Nothing
:
findIndexInAscendingList :: (Ord a) => a -> [a] -> Maybe Integer
findIndexInAscendingList a xs = find 0 xs
where
find i [] = Nothing -- won't get used for fibs
find i (x:xs) | a == x = Just i
| a < x = Nothing
| otherwise = find (i + 1) xs
invFib :: Integer -> Maybe Integer
invFib n = findIndexInAscendingList n fibs
所以:
$ ghci
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
λ: :load Fib.hs
[1 of 1] Compiling Main ( Fib.hs, interpreted )
Ok, modules loaded: Main.
λ: map invFib [54,55,56]
[Nothing,Just 10,Nothing]
还有其他一些方法可以做到这一点。考虑zip fibs [0..]
,然后您可以使用dropWhile
删除小于n
的部分并测试剩下的部分。
答案 1 :(得分:7)
为什么不使用像'takeWhile'这样的函数来返回你要检查的无限'fibs'列表的一部分?使用有限列表,您可以应用像'elemIndex'这样的函数,通过一点类型调整,可以返回您所追求的内容。
elemIndex myInteger (takeWhile (<= myInteger) fibs)
答案 2 :(得分:1)
如果你已经计算了fibs
,那么答案很简单:
import Data.List
invFib :: Integer -> Maybe Integer
invFib n = fmap fromIntegral (elemIndex n fibs)
fibs :: [Integer]
fibs = 0:1:(zipWith (+) fibs (tail fibs))