【发布时间】: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 <- [1..]。
我考虑过两种选择:
- 在
x <- [1..]中设置限制(取决于n) - 定义
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