首先是n个斐波那契数的总和

时间:2017-05-10 15:20:56

标签: haskell

我计算了前n个斐波纳契数的总和。 fib函数返回第n个fibonnaci数。但我不知道如何只加总前n个数字(n给定数字)

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

4 个答案:

答案 0 :(得分: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]

您可以使用fib执行相同的操作,map将其添加到第一个n数字上。如果您想对大型n执行此操作,则需要更有效地实施fib

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

Prelude> sum [1,3,7]
11

如果您将这三个想法放在一起,您可以sum fib获得第一个n数字的结果。

答案 1 :(得分: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

答案 2 :(得分:1)

fib找到第n个斐波纳契数

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

地图'是标准地图功能的实现(我不允许使用它)

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

答案 3 :(得分:0)

fibo 0=0
fibo 1=1
fibo n=fibo(n-2)+fibo(n-1)
fibosum n=sum [fibo i | i<-[0..n-1]]

此代码计算前n个斐波纳契数的总和。 fibo函数是计算斐波纳契数。