2017-05-10 12 views
0

最初の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 
+0

フィボナッチ数の無限リストを返す 'fib'関数を使用します(オンラインで調べることができます)。それから、 'sum(take n fib)'を使用してください。 – 4castle

+1

これはちょっと前にここで答えられました:http://stackoverflow.com/questions/43883290/how-does-haskell-compute-this-enormous-number-instantly/43893466# 43893466 – Nykros

+1

あなたは 'sum(Fib(1).. Fib(n))= Fib(n + 2)-1'を知っていますか? –

答えて

2

最初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のfibmapと同じことを行うことができます。 nのサイズを大きくしたい場合は、fibをより効率的に実装する必要があります。

sumリスト内の要素を使用できます。あなたが一緒にこれら三つのアイデアを入れた場合の例

Prelude> sum [1,3,7] 
11 

のためには、まずn番号についてfibの結果をsumすることができます。

+0

私はあなたの言うことを理解していますが、それを書いて管理する:) – Madalina

+0

最後のヒント。 'sumDouble n = sum(map double [1 ..n]) ' – Cirdec

+0

最初のn個のフィボナッチ数の和とsumDoubleの関係を理解できません。とにかくありがとうございました。 – Madalina

1

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]) 
+0

このコードスニペットは解決策ですが、[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)あなたの投稿。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – milo526

+0

@ milo526私はいくつかの説明を追加しました – Madalina

2

もう一つの良いオプションは、私たちが必要として無期限として多くのフィボナッチ数のリストを提供するために、怠惰な関数を生成することであろう。私たちは多くの再帰トリックでこれを達成することができますが、私は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 
+0

ありがとう、私はtheese関数を使用することはできません、私は基本的なものと思われています。 – Madalina

関連する問題