【问题标题】:Filtering fibonacci sequence in Haskell在 Haskell 中过滤斐波那契数列
【发布时间】:2011-05-04 06:27:06
【问题描述】:

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

我需要的只是奇数,并且小于或等于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]

这会给我我想要的,但同时该解决方案将不起作用,因为我不知道如何停止从 @987654323 检索元素@ 功能。当然,那是因为x &lt;- [1..]

我考虑过两种选择:

  1. x &lt;- [1..] 中设置限制(取决于n
  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]

【问题讨论】:

  • 已经是递归的了,你的意思是迭代的?
  • @ariel 我的意思是使用不止一个函数体(使用模式匹配等)来定义它,而不是使用列表推导来声明它。我说的是fibs,而不是fib

标签: haskell functional-programming fibonacci


【解决方案1】:

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

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

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

【讨论】:

  • @Oscar: Here you go.
  • @luqui:这让我想起了Project Euler #2。体育的全部意义在于学习自己解决问题。
  • @hammar 实际上,这是我必须解决的问题,但使用变量 n 而不是一百万,我只是省略了总和;)我将编辑我的答案,以便您看到我最后有两种解决方案。
【解决方案2】:

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

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

可以过滤出来只给出奇数:

oddFibs = filter odd fibs

可以截断小于等于N:

oddFibsLeN n = takeWhile (<= n) oddFibs

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 2017-01-23
    • 2017-12-06
    • 2015-01-06
    • 1970-01-01
    • 2021-11-27
    • 2015-06-05
    相关资源
    最近更新 更多