【问题标题】:How does this Fibonacci function work? [closed]这个斐波那契函数是如何工作的? [关闭]
【发布时间】:2018-06-12 13:21:03
【问题描述】:

谁能告诉我下面的函数是如何工作的?

尤其是fibu'-thing 和元组?谢谢!

fibu :: Integer -> Integer
fibu x = fst (fibu' x)
      where fibu' 0 = (0, 0)
            fibu' 1 = (1, 0)
            fibu' n = (a + l, l)
                      where (l, a) = fibu' (n-1)

【问题讨论】:

  • 你在哪些方面遇到了困难?
  • 正如我之前提到的 fibu'、tupels 和第二个 where
  • 不是最后一个fibu' 子句fibu' n = (a + l, l)(用+ l 代替+ 1)。
  • 哦,我的错。是的,它是一个“L”

标签: haskell recursion fibonacci


【解决方案1】:

我们先分析

fibu' 0 = (0, 0)
fibu' 1 = (1, 0)
fibu' n = (a + l, l)
    where (l, a) = fibu' (n-1)

这里我们有一个函数,它接受一个数字 i 作为输入,并返回一个包含两个数字的 2 元组。这两个数字是 (Fi, Fi-1)Fi i-th 斐波那契数。

前两个数字(对于 i = 0i = 1)是硬编码的(如 (0, 0)(1, 0))。但是我们当然不能硬编码斐波那契值。如果 i 不是 01,则将触发最后一行。本案例实现处理i-1案例。

在这种情况下,我们递归地计算fibu' (n-1)(所以元组包含(Fn-1, Fn-2) ,我们在前面的两个斐波那契数中计算。然后我们知道(这是斐波那契归纳关系 Fn = Fn-1 + Fn-2)。这意味着我们可以返回(a+l, l)。所以如果我们调用例如fibu' 5,它将调用fibu' 4fibu' 3等,直到我们到达fibu' 1,然后我们每次都会构造一个新的元组,它将继续计算最后两个斐波那契数,直到我们到达索引为5的斐波那契数。

现在fibu' 的唯一问题是它返回一个 2 元组,而用户通常希望得到一个简单的数字(i-th 斐波那契数)。所以现在我们定义一个函数:

fibu :: Integer -Integer
fibu x = fst (fibu' x)

这将返回 2 元组的 first 项(即第 i 个斐波那契数)。

【讨论】:

    【解决方案2】:

    您可能已经看过斐波那契数列的简单实现:

    fibo :: Integer -> Integer
    fibo 0 = 0
    fibo 1 = 1
    fibo n = fibo (n-1) + fibo (n-2)
    

    嗯,这个问题是函数调用自身两次,递归。而且这些调用中的每一个都会再次调用自己两次......所以你最终会得到成倍增长的调用。

    您所询问的实现如何解决此问题:它不仅返回第 n 个斐波那契数,还返回第 n 个和 n-1 个。那么 n+1 调用只需要 一个 额外的调用,而不是两次,因为一次调用提供了计算序列的下一个元素所需的一切。 p>

    对于最终结果,您不需要两个数字而是只需要一个,因此使用fst 丢弃倒数第二个值。

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 2020-03-09
      • 1970-01-01
      • 2023-03-11
      • 2012-02-09
      • 2017-10-15
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多