2

フィボナッチ数を含むリストをフィルタリングしようとしています。

私が必要とするのは奇数だけで、以下です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つのオプションについて考えました:

  1. に ( に依存するn) 制限を設定するx <- [1..]
  2. 再帰を定義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]
4

2 に答える 2

6

フィボナッチ数を計算するためのより効率的な方法もあります。

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

これは、奇数のみを与えるようにフィルタリングできます。

oddFibs = filter odd fibs

N以下に切り捨てることができるもの:

oddFibsLeN n = takeWhile (<= n) oddFibs
于 2011-05-04T07:05:11.743 に答える
6

Data.ListのtakeWhile関数を見てください (そして Prelude によって再エクスポートされます)。例えば、

takeWhile (< 4) [1..] == [1, 2, 3]

リストは無限ですが、述語を満たさない要素が見つかると終了することに注意してください。

于 2011-05-04T06:30:52.180 に答える