5

だから私は次のように記述された関数を作る必要があります

invFib :: Integer -> Maybe Integer

これは整数を取り、フィボナッチ数列でそれを探します(以下の関数で説明されているように)

fibs :: [Integer]
fibs = 0:1:(zipWith (+) fibs (tail fibs)) 

数値の例のインデックスを返します。

invFib 0~>Just 0

invFib 1~>Just 1またはJust 2

map invFib [54, 55, 56]~>[Nothing,Just 10,Nothing]

invFib (fibs !! 99)~>Just 99

整数のリストを取得してインデックスを吐き出す関数を作成しようとしましたが、失敗し続けます。何かご意見は?

これは私が試した機能です-

findNum :: [Integer] -> Integer -> Integer -> Integer
findNum x:xs y z = if x == y
                then z
                else findNum xs y (z+1)

編集: フィボナッチ数列にない数値で関数がフリーズし、1 が入力されたときに 1 つの値のみが表示されます

invFib :: Integer -> Maybe Integer
invFib n = if n < 0
        then Nothing
        else fmap fromIntegral (elemIndex n fibs)
4

3 に答える 3

7

「takeWhile」のような関数を使用して、調べたい無限の「fibs」リストのセクションを返さないのはなぜですか? 有限リストを使用すると、「elemIndex」のような関数を適用できます。この関数は、型を少し調整するだけで、求めているものを返すことができます。

elemIndex myInteger (takeWhile (<= myInteger) fibs)
于 2013-04-03T04:00:41.283 に答える
1

をすでに計算している場合fibs、答えは簡単です。

import Data.List

invFib :: Integer -> Maybe Integer
invFib n = fmap fromIntegral (elemIndex n fibs)

fibs :: [Integer]
fibs = 0:1:(zipWith (+) fibs (tail fibs))
于 2013-04-03T02:12:49.187 に答える