2010-12-05 21 views
5

Что будет наиболее эффективным способом для вычисления суммы чисел Фибоначчи от F(n) к F(m) где F(n) и F(m) являются п-й и MTH чисел Фибоначчи соответственно и 0 = < п < = м (с F (0) = 0, F (1) = 1).найти сумму чисел Фибоначчи

Например, если n=0, m=3, мы должны найти F(0)+F(1)+F(2)+F(3).

Просто с грубой силой это займет много времени для диапазона n и m. Если это можно сделать с помощью экспоненции матрицы, то как?

+0

I был бы очень рад узнать о применении этого ответа! – rjobidon 2010-12-05 03:51:35

+2

Я думаю, что мы дразнили вас достаточно долго, в частности, с намеком о Бине (вместо этого вы должны использовать линейную алгебру, как намекали на ваш вопрос). Также будьте осторожны, что `F (m + 2) - F (n + 2) - 2` не совсем корректен, но вы можете понять это, учитывая, что сумма фибо # на n эффективна F (n + 2) - 1 (подсказка: вам нужна сумма _inclusive_ из F (n), и, следовательно, вам нужно вычесть сумму фибо # до «n-1» и _субъект_ из F (m + 2) -2). Во всяком случае ... он выглядит и пахнет, как «HOMEWORK», сообщество SO не должно слишком много помогать ;-) – mjv 2010-12-05 04:50:01

+1

@mjv - это пахнет проблемой кодового соревнования для меня – Attila 2012-04-13 21:07:14

ответ

6

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

Буквально, сумма вашего верхней границы м, минус сумма вашего нижней границы п.

+2

Это еще не совсем правильно. Ответ просто F (m + 2) - F (n + 2), так как (-1) слагаются. – 2016-04-03 17:14:57

12

Учитывая, что «сумма первых n чисел Фибоначчи является (n + 2) nd числом Фибоначчи минус 1." (спасибо, Wikipedia), вы можете рассчитать F(m + 2) - F(n + 2) - 2. Используйте Binet's Fibonacci number formula для быстрого расчета F(m + 2) и F(n + 2). Кажется довольно эффективным для меня.

Update: нашел старый SO отправить, "nth fibonacci number in sublinear time", и (из-за точности как mjv и Jim Lewis указали в комментариях), you can't really escape an O(n) solution to calculate F(n).

1

Алгоритм с помощью матрицы собственности объяснения найдено here и here

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(); 
    } 
} 
8

Первых два ответа (старых из них), казалось бы, некорректной мне. В соответствии с этим 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, который объясняет один из способов сделать это.

0

Ответ:

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 

Теперь рассчитать Nth Фибоначчи в O (LogN) вы можете использовать матричный метод Возведение

Ссылка: - http://www.geeksforgeeks.org/program-for-nth-fibonacci-number/

Смежные вопросы