フィボナッチ数を含むリストをフィルタリングしようとしています。
私が必要とするのは奇数だけで、以下です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..]
。
私は2つのオプションについて考えました:
- に ( に依存する
n
) 制限を設定するx <- [1..]
- 再帰を定義
fibs
して、いつ停止するかを知ることができます(質問を書いているときに考えました)
どうすればこれを行うことができますか?
私は効率的な方法を探していません
編集:
最後に私が持っていた2つの解決策は次のとおりです。
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]