我正在尝试过滤包含斐波那契数字的列表。
我需要的只是奇数,而不是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
。
我考虑过两个选择:
x <- [1..]
n
)
x <- [1..]
递归,以便我知道何时停止(在撰写问题时考虑它)我该怎么做?
我不是在寻找一种有效的方法
修改
以下是我最后的两个解决方案:
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 []
答案 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