ハスケル初心者です。前回、フィボナッチ数列について学習したので、Fib 数列を作成できます。今、番号が Fib シーケンスに属しているかどうかをチェックする関数を作成する方法を考えています。
私は機能を意味します:
belongToFib :: Int -> Bool
コードは本当に必要ありません。これを処理する方法についてのいくつかのヒントで十分です。前もって感謝します。
ハスケル初心者です。前回、フィボナッチ数列について学習したので、Fib 数列を作成できます。今、番号が Fib シーケンスに属しているかどうかをチェックする関数を作成する方法を考えています。
私は機能を意味します:
belongToFib :: Int -> Bool
コードは本当に必要ありません。これを処理する方法についてのいくつかのヒントで十分です。前もって感謝します。
遅延評価を含むソリューションのヒントをいくつか示します。
これらは、定義する必要がある2つのものの署名です。
fib :: [Int]
belongToFib :: Int -> Bool
もちろん、これを機能させるにはいくつかのトリックが必要になります。リストには(理論的には)無限の数列がありますが、その怠惰のおかげで有限のサブシーケンスのみを処理する必要があることを確認すると、Haskellは厳密に必要な部分のみを生成し、関数は永久にループしません。したがって、への番号のメンバーシップを確認するときは、いつかfib
戻ってくるようにしてくださいFalse
。
もう1つの可能な解決策は、実際に入力まで生成するのではなく、算術のみに依存して、数値がフィボナッチ数列にあるかどうかを確認することです。このためのヒントとして、このスレッドを見てください。
ウィキペディアでは、フィボナッチ数列のメンバーシップを確認する他の方法がいくつかあります。
編集:ちなみに、でオーバーフローに注意してくださいInt
。代わりにに切り替えることをお勧めしInteger
ます。
増加する数のリストに数が含まれるかどうかをテストする関数のスケルトンを次に示します。
contains _ [] = False
contains n (x:xs)
| n == x = True
| n < x = ???
| otherwise = ???
私が開いたままにした場合に何が起こるべきか考えてください...
または、怠惰でPrelude
関数の使用が許可されている場合は、dropWhile
代わりにを参照してください。