在Haskell中过滤fibonacci序列

时间:2011-05-04 06:27:06

标签: 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]

这会给我我想要的东西,但同时该解决方案将无效,因为我不知道 如何停止 从{{中检索元素1}}功能。当然,那是因为fib

我考虑过两个选择:

  1. x <- [1..]
  2. 中设置限制(取决于n
  3. 定义x <- [1..]递归,以便我知道何时停止(在撰写问题时考虑它)
  4. 我该怎么做?

    我不是在寻找一种有效的方法

    修改
    以下是我最后的两个解决方案:

    fibs

    和使用@hammar建议的人:

    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 []
    

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:6)

还有一种更有效的方法来计算斐波纳契数:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

可以过滤哪些只能给出奇数:

oddFibs = filter odd fibs

可以将其截断为小于或等于N:

oddFibsLeN n = takeWhile (<= n) oddFibs