Haskell检查数字是否来自Fibonacci序列

时间:2012-05-24 10:34:43

标签: haskell

我是Haskell的初学者。上次我学习了Fibonacci序列,所以我可以创建Fib序列。现在我想知道如何编写一个函数来检查数字是否属于Fib序列。

我的意思是功能:

belongToFib :: Int -> Bool

我真的不需要代码。一些提示如何处理这就足够了。提前谢谢。

2 个答案:

答案 0 :(得分:4)

我会给你一些关于懒惰评估的解决方案的提示:

  1. 定义所有斐波那契数字的列表。
  2. 检查您的输入号码是否属于序列。
  3. 这些是您需要定义的两件事的签名:

    fib :: [Int]
    belongToFib :: Int -> Bool
    

    当然,你需要一些技巧来完成这项工作。即使你的列表有一个(理论上)无限的数字序列,如果你确定你只需要处理一个有限的子序列,由于它的懒惰,Haskell将只生成严格需要的部分,你的函数将永远不会循环。因此,在检查您的号码的成员资格为fib时,请务必在某个时候返回False

    另一种可能的解决方案是尝试找出你的数字是否在斐波纳契数列中,而不是实际生成输入,而是仅仅依靠算术。作为提示,请查看this thread

    Wikipedia上,您会找到许多其他方法来检查斐波纳契序列的成员资格。

    编辑:顺便提一下,请注意Int的溢出。您可能希望转而使用Integer

答案 1 :(得分:2)

这是一个函数的框架,用于测试一个数字是否出现在增加的数字列表中:

contains _ [] = False
contains n (x:xs) 
   | n == x = True 
   | n < x = ???
   | otherwise = ???

想想在我离开的情况下会发生什么......

或者,如果您既懒惰又允许使用Prelude函数,则可以查看dropWhile