list - 如何判断一个数字是否在斐波那契数列中

标签 list haskell fibonacci

我创建了一个函数,可以给出给定输入的斐波那契数列。我现在想创建一个函数来检查给定的数字是否在斐波那契数列中。

这是我到目前为止所做的:

-- Basic Fib Function 
fib :: Int -> Int 
fib x =
  if x < 1
    then 0
    else if x < 2
           then 1
           else fib (x - 1) + fib (x - 2)

-- Outputs list of all the functions 
fibList :: [Int]
fibList  = map fib [1..]
--  function that takes an Integer, and returns True if the argument is a Fibonacci number and False otherwise
isFib :: Int -> [Int] -> Bool
isFib n fibList
    |n `elem` fibList = True
    |otherwise = False

fibList 可以工作,但计算需要很长时间。 另外,我已经这样做了:

fibList' :: [Int]
fibList'  = map fib [1..100]

isFib' :: Int -> [Int] -> Bool
isFib' n fibList'
    |n `elem` fibList' = True
    |otherwise = False

数字较小时,计算时间仍然较长

ghci

最佳答案

问题是 n 是一个 IntfibList 是一个 [Int],你不能检查 Int[Int] 是否相同,因为它们具有不同的类型。

如果给定的数字不是斐波那契数,则使用elem也会失败,因为Haskell将继续枚举列表寻找下一个候选数,并且只会返回如果到达列表末尾,False,但如果生成无限列表,那么这将永远不会结束。

您可以实现 isFib 函数,我们检查列表的第一项是否大于 n。如果是这种情况,我们知道所有剩余元素都会更大,因此我们可以停止搜索:

isFib :: Int -> [Int] -> Bool
isFib _ [] = False
isFib n (x:xs)
    | x >= n = -- ...  🖘 to implement
    | otherwise = isFib n xs

我将填写 ... 部分作为练习。

您的 fib 函数效率不高:需要指数时间来确定第 n 个元素。您可以通过递归生成斐波那契数列,并检查我们生成的其中一项是否确实是斐波那契数列:

isFib :: Int -> Bool
isFib n = go 0 1
  where go f1 f2
          | f1 >= n = …
          | otherwise = go f2 (f1 + f2)

关于list - 如何判断一个数字是否在斐波那契数列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70634658/

相关文章:

haskell - 如何在 Helm 中合并信号?

haskell - Haskell 对函数定义中的顺序敏感吗?

function - 两个相似的函数如何在 Haskell 中具有不同的多态类型?

javascript - 检查输入是否与 ul 中的值重复

java - Spring Cassandra 存储一个带有自定义对象的列表

c# - 如何在 C# 中将嵌套列表转换为数据集

c# - 在列表中查找 int 的索引

haskell - 一起使用 Maybe 和 Writer

algorithm - 通过包装器优化斐波那契数列递归函数

c - 时钟为什么不走?它停留在 0.000000000。