我是 Haskell 初学者。上次我学习了斐波那契数列,所以我可以创建斐波那契数列。现在我想知道如何编写一个函数来检查数字是否属于 Fib 序列。
我的意思是功能:
belongToFib :: Int -> Bool
我真的不需要代码。一些提示如何处理就足够了。提前致谢。
我是 Haskell 初学者。上次我学习了斐波那契数列,所以我可以创建斐波那契数列。现在我想知道如何编写一个函数来检查数字是否属于 Fib 序列。
我的意思是功能:
belongToFib :: Int -> Bool
我真的不需要代码。一些提示如何处理就足够了。提前致谢。
我将为您提供一些涉及惰性评估的解决方案的提示:
这些是您需要定义的两件事的签名:
fib :: [Int]
belongToFib :: Int -> Bool
当然,你需要一些技巧来完成这项工作。即使你的列表有一个(理论上)无限的数字序列,如果你确保你只需要处理一个有限的子序列,由于它的惰性,Haskell 将只生成严格需要的部分,并且你的函数不会永远循环. 因此,在检查您的号码的成员资格时,请fib
确保您False
在某个时候返回。
另一种可能的解决方案是尝试找出您的数字是否在斐波那契数列中,而无需实际生成到输入,而是仅依靠算术。作为对此的提示,请查看此线程。
在Wikipedia上,您会找到许多其他方法来检查斐波那契数列的成员资格。
编辑:顺便说一句,当心Int
. 您可能希望Integer
改用。
这是一个函数的框架,用于测试一个数字是否出现在一个递增的数字列表中:
contains _ [] = False
contains n (x:xs)
| n == x = True
| n < x = ???
| otherwise = ???
想想在我未解决的情况下应该发生什么......
或者,如果你既懒惰又允许使用Prelude
函数,你可以看看dropWhile
。