计算从F(n)
到F(m)
的斐波纳契数之和的最有效方法是F(n)
和F(m)
分别为第n和第m个斐波那契数,0 =&LT; n <= m <10 9 (F(0)= 0,F(1)= 1)。
例如,如果n=0
,m=3
,我们需要找到F(0)+F(1)+F(2)+F(3)
。
只需蛮力,所提到的n
和m
范围需要很长时间。如果可以通过矩阵求幂来完成那么?
答案 0 :(得分:15)
前两个答案(最老的答案)对我来说似乎不正确。根据其中一个答案中已经引用的discussion,第一个n
斐波那契数的总和由下式给出:
SumFib(n) = F[n+2] - 1 (1)
现在,让我们将SumFib(m, n)
定义为从m
到n
包含的斐波那契数字之和(根据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
加成:
当m
和n
很大时,您需要有效的算法来生成斐波纳契数。这是一个非常好的article,它解释了一种方法。
脚注:在问题m
和n
中,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",并且(由于mjv和Jim Lewis的准确性已在评论中指出),you can't really escape an O(n)
solution to calculate F(n)
。
答案 2 :(得分:8)
F(m+2) - F(n+2) - 2
(discussion)
从字面上看,你的上界m的总和减去你的下界n的总和。
答案 3 :(得分:1)
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/