计算第个斐波那契数的高效算法


11

可以使用以下递归在线性时间中计算第个斐波那契数:n

def fib(n):
    i, j = 1, 1
    for k in {1...n-1}:
        i, j = j, i+j
    return i

第个斐波那契数也可以计算为。但是,这对于甚至较小的都有舍入问题。可能有一些解决方法,但我宁愿不这样做。[ φ Ñ / nn[φn/5]n

是否有一种有效的算法(值为或更好的对数)来计算不依赖浮点算术的第个斐波那契数?假定整数运算(,,,)可在恒定的时间来执行。n + - × /nn+×/


5
作为建议,维基百科上有关斐波那契数的文章有很多方法。
化名

cf. stackoverflow.com/questions/14661633/…以及其中和周围的链接。
尼斯

Answers:


14

您可以使用矩阵幂和 在您的计算模型中,如果使用重复平方来实现幂运算,则这是算法。Ologn

[1110]n=[Fn+1FnFnFn1].
O(logn)

1
这是经典。
dfeuer 2015年

8
您还可以使用此标识导出递归和。 F 2 n = F 2 n + 2 F n 1 F nF2n1=Fn2+Fn12F2n=Fn2+2Fn1Fn
augurar 2015年

4

您可以阅读以下数学文章: 一种用于计算大斐波那契数的快速算法(Daisuke Takahashi): PDF

更简单的是,我用C ++(不带GMP)和Python实现了几种斐波那契算法。有关Bitbucket的完整资料。在主页上,您还可以访问以下链接:

  • C ++ HTML在线文档。
  • 一些数学文件: 斐波那契数-实施良好算法的几种关系

最有用的公式是:

  • F2n=Fn+12Fn12=2FnFn1+Fn2
  • F2n+1=Fn+12+Fn2

在算法上要小心。您不得多次计算相同的值。一个简单的递归算法(在Python中):

def fibonacci_pair(n):
    """Return (F_{n-1}, F_n)"""
    if n != 0:
        f_k_1, f_k = fibonacci_pair(n//2)  # F_{k-1},F_k with k = n/2

        return ((f_k**2 + f_k_1**2,
                 ((f_k*f_k_1)*2) + f_k**2) if n & 1 == 0  # even
                else (((f_k*f_k_1)*2) + f_k**2,
                      (f_k + f_k_1)**2 + f_k**2))
    else:
        return (1, 0)

它的复杂度是对数的(如果基本操作是在恒定的时间内):。O(logn)


2
欢迎来到计算机科学。请问您可以在答案中添加更多信息吗?目前,它仅是两个链接,因此,如果这些链接消失或它们所在的服务器不可用,您的答案将变得毫无意义。指向更多信息的链接很好,但是这里的链接是唯一的信息。另外,请注意,问题绝对是关于算法的,而不是关于C ++实现的。实施倾向于掩盖特定于语言的细节背后的算法。
大卫·里希比

大卫,第一个链接是指向数学文章的链接。标题为“快速算法 ”的问题回答了“是否有一种有效的(对数n或更佳的)算法[...]?第二个链接是指向我在C ++ Python中的各种实现的链接,以及一个带有几个公式的数学文件。
奥利维尔·皮尔森

2
不,您的答案所包含的文章标题无济于事。该的文章,你的答案包含几乎没有的,听起来像它可能不回答这个问题的。但是Stack Exchange是一个问答网站,而不是链接场。(而且,不,我不建议您将文章复制粘贴到您的答案中。但是需要摘要。)
David Richerby,2015年

如果要摘要,请写下!
奥利维尔·皮尔森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.