2

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

我的意思是功能:

belongToFib :: Int -> Bool

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

4

2 回答 2

4

我将为您提供一些涉及惰性评估的解决方案的提示:

  1. 定义所有斐波那契数列。
  2. 检查您输入的数字是否属于该序列。

这些是您需要定义的两件事的签名:

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

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

另一种可能的解决方案是尝试找出您的数字是否在斐波那契数列中,而无需实际生成到输入,而是仅依靠算术。作为对此的提示,请查看此线程

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

编辑:顺便说一句,当心Int. 您可能希望Integer改用。

于 2012-05-24T10:57:02.547 回答
2

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

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

想想在我未解决的情况下应该发生什么......

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

于 2012-05-24T11:55:51.607 回答