作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试过滤包含斐波那契数列的列表。
我需要的只是奇数,并且小于或等于 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..]
。
我考虑过两种选择:
n
中设置限制(取决于 x <- [1..]
)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/
我是一名优秀的程序员,十分优秀!