我计算了前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
答案 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函数是计算斐波纳契数。