我是Haskell的初学者。上次我学习了Fibonacci序列,所以我可以创建Fib序列。现在我想知道如何编写一个函数来检查数字是否属于Fib序列。
我的意思是功能:
belongToFib :: Int -> Bool
我真的不需要代码。一些提示如何处理这就足够了。提前谢谢。
答案 0 :(得分:4)
我会给你一些关于懒惰评估的解决方案的提示:
这些是您需要定义的两件事的签名:
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
。