我正在尝试过滤包含斐波那契数的列表。
我需要的只是奇数,并且小于或等于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]