找到斐波纳契数的总和

时间:2010-12-05 03:34:42

标签: fibonacci

计算从F(n)F(m)的斐波纳契数之和的最有效方法是F(n)F(m)分别为第n和第m个斐波那契数,0 =&LT; n <= m <10 9 (F(0)= 0,F(1)= 1)。

例如,如果n=0m=3,我们需要找到F(0)+F(1)+F(2)+F(3)

只需蛮力,所提到的nm范围需要很长时间。如果可以通过矩阵求幂来完成那么?

5 个答案:

答案 0 :(得分:15)

前两个答案(最老的答案)对我来说似乎不正确。根据其中一个答案中已经引用的discussion,第一个n斐波那契数的总和由下式给出:

SumFib(n) = F[n+2] - 1                          (1)

现在,让我们将SumFib(m, n)定义为从mn 包含的斐波那契数字之和(根据OP的要求)(请参阅脚注)。所以:

SumFib(m, n) = SumFib(n) - SumFib(m-1)

注意第二学期。之所以如此,是因为SumFib(m)包含F[m],但我们希望从F[m]F[n] 包含之和。因此,我们总结为F[m-1]总和为F[n]。简单的幼儿园数学,不是吗? :-)

SumFib(m, n) = SumFib(n) - SumFib(m-1)
             = (F[n+2] - 1) - (F[m-1 + 2] - 1)    [using eq(1)]
             = F[n+2] - 1 - F[m+1] + 1
             = F[n+2] - F[m+1]

Therefore, SumFib(m, n) = F[n+2] - F[m+1]                    (2)

示例:

m = 3, n = 7
Sum = F[3] + F[4] + F[5] + F[6] + F[7]
    = 2 + 3 + 5 + 8 + 13
    = 31

使用上面派生的(2)

SumFib(3, 7) = F[7+2] - F[3+1]
             = F[9] - F[4]
             = 34 - 3
             = 31

加成:
mn很大时,您需要有效的算法来生成斐波纳契数。这是一个非常好的article,它解释了一种方法。

脚注:在问题mn中,OP满足此范围:0 =< n <= m,但在我的回答中,范围有点改变,它是0 =< m <= n

答案 1 :(得分:12)

鉴于“前n个斐波纳契数的和是(n + 2)和斐波纳契数减1。” (谢谢,Wikipedia),您可以计算F(m + 2) - F(n + 2)(不应该有-2,请参阅Sнаđошƒаӽ's answer for what I'd overlooked)。使用Binet's Fibonacci number formula快速计算F(m + 2)F(n + 2)。对我来说似乎相当有效。

更新:找到旧的SO帖子"nth fibonacci number in sublinear time",并且(由于mjvJim Lewis的准确性已在评论中指出),you can't really escape an O(n) solution to calculate F(n)

答案 2 :(得分:8)

F(m+2) - F(n+2) - 2discussion

从字面上看,你的上界m的总和减去你的下界n的总和。

答案 3 :(得分:1)

通过矩阵属性解释找到herehere

的算法
class Program
{
    static int FibMatrix(int n, int i, int h, int j, int k)
    {
        int t = 0;

        while (n > 0)
        {
            if (n % 2 == 1)
            {
                t = j * h;
                j = i * h + j * k + t;
                i = i * k + t;
            }
            t = h * h;
            h = 2 * k * h + t;
            k = k * k + t;
            n = n / 2;
        }

        return j;            
    }

    static int FibSum(int n, int m)
    {
        int sum = Program.FibMatrix(n, 1, 1, 0, 0);

        while (n + 1 <= m)
        {
            sum += Program.FibMatrix(n + 1, 1, 1, 0, 0);
            n++;
        }

        return sum;
    }

    static void Main(string[] args)
    {
        // Output : 4
        Console.WriteLine(Program.FibSum(0, 4).ToString());

        Console.ReadLine();
    }
}

答案 4 :(得分:1)

答案是:

f(m+2)-f(n+1)

示例:

for n = 3 to m = 8

Ans1 = f(m+2) = f(10) = 55

Ans2 = f(n+1) = f(4) = 3 

Answer = 55 - 3 = 52

现在计算O(logN)中的第N个斐波那契 你可以使用矩阵指数法

链接: - http://www.geeksforgeeks.org/program-for-nth-fibonacci-number/