2

ハスケル初心者です。前回、フィボナッチ数列について学習したので、Fib 数列を作成できます。今、番号が Fib シーケンスに属しているかどうかをチェックする関数を作成する方法を考えています。

私は機能を意味します:

belongToFib :: Int -> Bool

コードは本当に必要ありません。これを処理する方法についてのいくつかのヒントで十分です。前もって感謝します。

4

2 に答える 2

4

遅延評価を含むソリューションのヒントをいくつか示します。

  1. すべてのフィボナッチ数のリストを定義します。
  2. 入力番号がシーケンスに属しているかどうかを確認してください。

これらは、定義する必要がある2つのものの署名です。

fib :: [Int]
belongToFib :: Int -> Bool

もちろん、これを機能させるにはいくつかのトリックが必要になります。リストには(理論的には)無限の数列がありますが、その怠惰のおかげで有限のサブシーケンスのみを処理する必要があることを確認すると、Haskellは厳密に必要な部分のみを生成し、関数は永久にループしません。したがって、への番号のメンバーシップを確認するときは、いつかfib戻ってくるようにしてくださいFalse

もう1つの可能な解決策は、実際に入力まで生成するのではなく、算術のみに依存して、数値がフィボナッチ数列にあるかどうかを確認することです。このためのヒントとして、このスレッドを見てください。

ウィキペディアでは、フィボナッチ数列メンバーシップを確認する他の方法がいくつかあります。

編集:ちなみに、でオーバーフローに注意してくださいInt。代わりにに切り替えることをお勧めしIntegerます。

于 2012-05-24T10:57:02.547 に答える
2

増加する数のリストに数が含まれるかどうかをテストする関数のスケルトンを次に示します。

contains _ [] = False
contains n (x:xs) 
   | n == x = True 
   | n < x = ???
   | otherwise = ???

私が開いたままにした場合に何が起こるべきか考えてください...

または、怠惰でPrelude関数の使用が許可されている場合は、dropWhile代わりにを参照してください。

于 2012-05-24T11:55:51.607 に答える