2017-05-10 31 views
0

我有tu計算前n個斐波那契數的和。 fib函數返回第n個fibonnaci數。但我不知道如何總結只有第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] 

你可以做同樣的事情fibmap荷蘭國際集團就在第一n號碼。如果你想爲n這麼做,你需要更高效的執行fib

您可以sum列表中的元素。例如

Prelude> sum [1,3,7] 
11 

如果你把這些三條思路在一起,你可以sumfib結果的第一n號碼。

+0

我明白你的意思,但我可以' t管理寫它:) – Madalina

+0

最後一個提示。 'sumDouble n = sum(map double [1 ..n])' – Cirdec

+0

我不明白sumDouble與第n個斐波那契數的和是多少。無論如何..謝謝你。 – Madalina

1

FIB發現第n Fibonacci數

fib :: Int -> Int 
fib 0 = 0 
fib 1 = 1 
fib x = fib (x-1) + fib (x-2) 

地圖」是標準映射函數的implemantation(我是不允許使用它)

map' :: (a -> b) -> [a] -> [b] 
map' _ [] = [] 
map' f (x:xs) = f x : map' f xs 

sumFib計算的總和前n個fibonnaci數字。

sumFib :: Int -> Int 
sumFib x = sum (map' fib [1..x]) 
+0

儘管此代碼片段可能是解決方案,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-基於代碼的答案)確實有助於提高質量您的帖子。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – milo526

+0

@ milo526我已經添加了一些解釋 – Madalina

2

另一個很好的選擇是生成一個懶惰的功能給我們提供無限Fibonacci數的名單多達我們需要的。雖然我們可以通過很多遞歸技巧來實現這一點,但我相信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

謝謝,事情是我不能使用這些函數,我被認爲是基本函數。 – Madalina