Haskell检查数字是否来自斐波那契序列

Haskell检查数字是否来自斐波那契序列,haskell,Haskell,我是哈斯克尔初学者。上次我学习了斐波那契序列,所以我可以创建斐波那契序列。现在我想知道如何编写一个函数来检查数字是否属于Fib序列 我的意思是功能: belongToFib :: Int -> Bool 我真的不需要代码。一些关于如何处理这个问题的提示就足够了。提前感谢。我将为您提供一些有关惰性评估解决方案的提示: 定义所有斐波那契数的列表 检查您的输入编号是否属于该序列 以下是您需要定义的两件事的特征: fib :: [Int] belongToFib :: Int -> Boo

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

我的意思是功能:

belongToFib :: Int -> Bool

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

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

  • 定义所有斐波那契数的列表
  • 检查您的输入编号是否属于该序列
  • 以下是您需要定义的两件事的特征:

    fib :: [Int]
    belongToFib :: Int -> Bool
    
    当然,你需要一些技巧来实现这一点。即使您的列表(理论上)有一个无限的数字序列,但如果您确保只需要处理有限的子序列,由于它的惰性,Haskell将只生成严格需要的部分,并且您的函数将不会永远循环。因此,在检查您的号码是否属于
    fib
    时,请确保在某个时候返回
    False

    另一个可能的解决方案是,在不实际生成输入的情况下,尝试找出您的数字是否在斐波那契序列中,而只是依靠算术。作为对此的提示,请查看

    在上,您将找到许多其他方法来检查斐波那契序列的成员资格


    编辑:顺便说一句,注意
    Int
    的溢出。您可能希望切换到整数。

    以下是一个函数的框架,该函数测试一个数字是否出现在一个递增的数字列表中:

    contains _ [] = False
    contains n (x:xs) 
       | n == x = True 
       | n < x = ???
       | otherwise = ???
    
    包含[]=False
    包含n(x:xs)
    |n==x=True
    |n
    想想我留下的案子会发生什么


    或者,如果你都很懒,并且被允许使用
    Prelude
    函数,你可以改为查看
    dropWhile

    这真的有可能吗?我会开始创建斐波那契序列,并对照你的数字(x)进行检查,只要最新的斐波那契数是@MatveyAksenov,直到现在还不知道;如果练习不是搜索序列,那么你可以检查(5∗n^2+4)或(5)∗n^2−4) 是一个完美的正方形。对于
    Int
    ,在创建斐波那契数列表时,必须小心溢出。我知道,我本来会建议使用整数,但我决定保留他的原始签名。也许我会加上它作为旁注。