我正在尝试过滤包含斐波那契数字的列表。
我需要的只是奇数,并且小于或等于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
) in x <- [1..]
- 定义
fibs
递归,这样我就可以知道何时停止(在写问题时考虑过)
我怎么能这样做呢?
我不是在寻找有效的方法
Edit:
这是我最后得到的两个解决方案:
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功能 http://www.haskell.org/ghc/docs/7.0.3/html/libraries/base/Data-List.html#v%3atakeWhile来自 Data.List(并由 Prelude 重新导出)。例如,
takeWhile (< 4) [1..] == [1, 2, 3]
请注意,即使列表是无限的,一旦找到不满足谓词的元素,该列表就会终止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)