【问题标题】:Finding the sum of Fibonacci Numbers找到斐波那契数的总和
【发布时间】:2010-12-05 03:34:42
【问题描述】:

计算从F(n)F(m) 的斐波那契数之和的最有效方法是什么,其中F(n)F(m) 分别是第n 个和第m 个斐波那契数,0 =9(F(0)=0,F(1)=1)。

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

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

【问题讨论】:

  • 很高兴知道这个答案的应用!
  • 我认为我们已经取笑你足够长的时间了,特别是关于 Binet 的提示(相反,你应该使用问题中暗示的线性代数)。还要注意 F(m+2) - F(n+2) - 2 不是很正确,但你可以弄清楚,因为 fibo # 到 n 的总和实际上是 F(n+2) -1 (提示:你想要总和 inclusive i> 的 F(n),因此您需要从 F(m+2) -2) 中减去 fibo # 的总和直到 n-1substract。无论如何......它看起来和闻起来都像HOMEWORK,SO 社区不应该提供太多帮助;-)
  • @mjv - 我闻起来像是编码竞争问题

标签: fibonacci


【解决方案1】:

前两个答案(最旧的)对我来说似乎不正确。根据已在其中一个答案中引用的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[n] 的总和中减去 F[m-1] 的总和。简单的幼儿园数学,不是吗? :-)

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,它解释了一种方法。


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

【讨论】:

  • +1。我对你上面两个答案的赞成票感到非常惊讶。如果总和包含在内,我们真的应该期望 SumFib(n,n)
  • 谢谢@Daenerys。我不这么认为。 SumFib(n, n) 应该非常明智地等于 Fib(n)
  • 谢谢!这应该是正确的答案。拯救了我的一天:)
【解决方案2】:

假设“前 n 个斐波那契数的和是 (n + 2)nd 斐波那契数减 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 在 cmets 中指出的准确性)you can't really escape an O(n) solution to calculate F(n)

【讨论】:

  • @MrGomez 也必须为你 +1 以击败我的基本公式 :)
  • 配方上的一切都很好。在计算方面,您需要对 Phi 和/或 sqrt(5) 进行非常精确的计算才能在大数上使用 Binet...
  • @mjv,是的 - 我不确定它们需要多精确才能避免将错误四舍五入到 F(1 billion)...
  • @jball: F(10^9) 有大约 2.04 亿位,如果我计算正确的话,所以你可能需要知道 phi 以及它对这个精度的巨大影响。
  • @Jim Lewis,似乎传统的迭代是获得更大价值的方式。不过,以百万计,这将是相当缓慢的。
【解决方案3】:

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

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

【讨论】:

  • 这并不完全正确。答案很简单 F(m+2) - F(n+2),因为 (-1) 项抵消了。
  • @JørgenFogh 并不是说​​它不完全正确,它实际上完全不正确。对答案的 OP 没有冒犯。
  • @Sнаđошƒаӽ 这个想法是正确的。答案始终相差 2,与正确答案并非完全无关。
  • @JørgenFogh 是的,没错。顺便说一句,我在这篇文章中添加了我自己的答案。欢迎您看一看并发表评论;-)
【解决方案4】:

通过矩阵属性解释找到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();
    }
}

【讨论】:

    【解决方案5】:

    答案是:

    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/

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多