最初のnフィボナッチ数の合計を計算しました。 fib関数はn番目のfibonnaci数を返します。しかし、私は最初のn個(nは与えられた数)最初のnフィボナッチ数の合計haskell
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib x = fib (x-1) + fib (x-2)
sumFib :: Int -> Int
sumFib x = if x == fib x then x+fib x else fib x
最初のnフィボナッチ数の合計を計算しました。 fib関数はn番目のfibonnaci数を返します。しかし、私は最初のn個(nは与えられた数)最初のnフィボナッチ数の合計haskell
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib x = fib (x-1) + fib (x-2)
sumFib :: Int -> Int
sumFib x = if x == fib x then x+fib x else fib x
最初n
数字は[1 .. n]
をしているを合計する方法を知りません。例えば、GHCiの
Prelude> [1..7]
[1,2,3,4,5,6,7]
では、リスト内の各要素に、その関数を適用し、リスト上の機能をmap
、得られたリストを返すことができます。例
Prelude> double x = x+x
Prelude> map double [1..7]
[2,4,6,8,10,12,14]
のためにあなたはまずn
数字にそれをINGのfib
、map
と同じことを行うことができます。 n
のサイズを大きくしたい場合は、fib
をより効率的に実装する必要があります。
sum
リスト内の要素を使用できます。あなたが一緒にこれら三つのアイデアを入れた場合の例
Prelude> sum [1,3,7]
11
のためには、まずn
番号についてfib
の結果をsum
することができます。
FIBはsumFibはの和を計算
map' :: (a -> b) -> [a] -> [b]
map' _ [] = []
map' f (x:xs) = f x : map' f xs
(私はそれを使用することができなかった)n番目のフィボナッチ数
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib x = fib (x-1) + fib (x-2)
地図」は標準マップ関数のimplemantationある認めます最初のnフィブロナシ数。
sumFib :: Int -> Int
sumFib x = sum (map' fib [1..x])
もう一つの良いオプションは、私たちが必要として無期限として多くのフィボナッチ数のリストを提供するために、怠惰な関数を生成することであろう。私たちは多くの再帰トリックでこれを達成することができますが、私はHaskellの関数を生成するシリーズ、すなわちunfoldr
が理想的です。次のコードは、私たちをゆっくりと必要な数のフィボナッチ数のリストを美しく生成します。
fibs :: [Integer]
fibs = unfoldr (\(f,s) -> Just (f,(s,f+s))) (0,1)
ここで、フィボナッチ数の合計を所定の数まで取得するだけです。この時点で、take
関数は便利です。 take
は最初のn
の項目をとります。次に、結果リストにsum
関数を適用するだけです。
fibs :: [Integer]
fibs = unfoldr (\(f,s) -> Just (f,(s,f+s))) (0,1)
sumNFibs :: Int -> Integer
sumNFibs = sum . (flip take) fibs
*Main> sumNFibs 10
88
ありがとう、私はtheese関数を使用することはできません、私は基本的なものと思われています。 – Madalina
フィボナッチ数の無限リストを返す 'fib'関数を使用します(オンラインで調べることができます)。それから、 'sum(take n fib)'を使用してください。 – 4castle
これはちょっと前にここで答えられました:http://stackoverflow.com/questions/43883290/how-does-haskell-compute-this-enormous-number-instantly/43893466# 43893466 – Nykros
あなたは 'sum(Fib(1).. Fib(n))= Fib(n + 2)-1'を知っていますか? –