haskell - 在 Haskell 中过滤斐波那契数列

标签 haskell functional-programming fibonacci

我正在尝试过滤包含斐波那契数列的列表。

我需要的只是奇数,并且小于或等于 N

这是我到目前为止所拥有的:

fib   n | n == 0         = 0
        | n == 1         = 1
        | otherwise = fib (n-1) + fib (n-2)

fibs n = [a | a <- [fib x | x <- [1..]], odd a, a < n]

这会给我我想要的,但同时该解决方案不起作用,因为我不知道如何停止fib 函数检索元素。当然,这是因为 x <- [1..]

我考虑过两种选择:

  1. n 中设置限制(取决于 x <- [1..] )
  2. 定义 fibs 递归,以便我知道何时停止(在编写问题时考虑过)

我怎样才能做到这一点?

我不是在寻找有效的方法

编辑:
这是我最后得到的两个解决方案:

fib   n | n == 0         = 0
        | n == 1         = 1
        | otherwise = fib (n-1) + fib (n-2)

fibsAux n k xs  | a < n     = fibsAux n (k+1) (xs ++ [a])
                | otherwise = xs
                where 
                    a = fib k
fibs n = filter odd $ fibsAux n 0 []

以及使用@hammar建议的一个:

fibs x = takeWhile (< x) [a | a <- [fib x | x <- [1..]], odd n]

最佳答案

看看the takeWhile function来自 Data.List(并由 Prelude 重新导出)。例如,

takeWhile (< 4) [1..] == [1, 2, 3]

请注意,即使列表是无限的,一旦找到不满足谓词的元素,就会终止。

关于haskell - 在 Haskell 中过滤斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5879415/

相关文章:

java - java中斐波那契函数的尾调用优化

functional-programming - 标准 ML 仿函数示例

c++ - 这个矩阵博览会代码是对数的吗?

haskell - 商类型如何帮助安全地暴露模块内部?

haskell - 数据系列默认实例

haskell - 使用 GHC (+ LLVM) 将 GMP 静态链接到 Haskell 应用程序

regex - Haskell:正则表达式和 Data.Text

scala - 为什么 Haskell 的 foldr 不是 stackoverflow 而相同的 Scala 实现呢?

scala - 幺半群如何泛化类型