【问题标题】:Fibonacci sequence in haskell returning all the values [duplicate]haskell中的斐波那契序列返回所有值[重复]
【发布时间】:2013-04-15 10:47:03
【问题描述】:

我需要帮助我使用 haskell 进行作业,它返回一个列表,直到斐波那契数列中的第 n 个数字。

喜欢

Main> fib 5
[0,1,1,2,3,5]
Main> fib 15
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]

我明白了

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

但我不知道如何生成包含直到第 n 个数字的所有值的列表。

谢谢

【问题讨论】:

  • 在函数上打印 n。
  • 非常简单但性能明智的白痴方法是简单地mapfib 超过[1..n]。例如:fibs n = map fib [1..n].
  • @SenthilPrabhu 我该怎么做?我是一个非常初学者,如果你能给我一个例子会很有帮助
  • @gspr 谢谢它的工作,但有没有办法将 (fibs n= map fib[1..n]) 包含到 fib 函数中?

标签: haskell fibonacci


【解决方案1】:

有几种很酷的方法,首先是最简单的

fib::Int->Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
fibList n = map fib [1..n]

或者我们可以将其合并为一个

fib::Int->[Int]
fib 0 = [0]
fib 1 = [1, 0]
fib n = (head (fib (n-1)) + head (fib (n-2))) : fib (n-1)

所以这里我们只是将列表构建与递归结合起来。现在我们向疯狂迈出了一步

fib n = take n fiblist
  where fiblist = 0:1:(zipWith (+) fiblist (tail fiblist))

这里的fiblist 是一个无限的斐波那契数列。我们所做的只是抓住适当的数量。这是可能的,因为 Haskell 是“懒惰的”。如果您是 Haskell 新手,只需微笑和点头。

最后,对于踢腿和咯咯笑

fib = flip take . fix $ \f -> 0 : 1 : (zipWith (+) f (tail f))

除了无点和固定点而不是递归之外,这与上述相同。

同样,如果您是 haskell 的新手,前 2 个更容易理解,几周后再回到最后 2 个 :)

【讨论】:

  • 谢谢你,这个答案很棒!
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2011-02-17
  • 2017-12-06
  • 2019-04-06
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多