【问题标题】:Sum of first n fibonacci numbers haskell前 n 个斐波那契数的总和 haskell
【发布时间】:2017-05-10 15:20:55
【问题描述】:

我让你计算前 n 个斐波那契数的总和。 fib 函数返回第 n 个斐波那契数。但我不知道如何仅对前 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

【问题讨论】:

  • 使用fib 函数返回无限的斐波那契数列(您可以在线查找)。然后使用sum (take n fib)
  • 刚才在这里回答了这个问题:stackoverflow.com/questions/43883290/…
  • 你知道sum(Fib(1)..Fib(n)) = Fib(n+2) -1 吗?
  • @Jonathan M:不,我不知道 :) 谢谢
  • @4castle:我不能用“take”,我只能用Type A - 基本功能

标签: haskell


【解决方案1】:

第一个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

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

【讨论】:

  • 最后一个提示。 sumDouble n = sum (map double [1..n])
  • 我不明白 sumDouble 与第一个 n 斐波那契数的总和有什么关系。无论如何..谢谢。
  • @Madalina 这是 Cirdec 提供给您的提示。它非常接近您想要的,只是它使用了加倍功能。除此之外的任何事情都会放弃解决方案。 (这就是 Cirdec 写“最后一个提示”的原因。)
  • @chi:谢谢。它有效,但如果我不允许使用地图,我会改为定义地图。我会发布答案。再次感谢大家
【解决方案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

【讨论】:

  • 谢谢,问题是我不能使用这些功能,我应该是基本的。
【解决方案3】:

fib 找到第 n 个斐波那契数

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

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

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

sumFib 计算前 n 个斐波那契数的总和。

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

【讨论】:

  • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • @milo526 我已经添加了一些解释
【解决方案4】:
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 函数是计算斐波那契数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2017-12-06
    • 2021-12-21
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多