Давайте посчитаем сумму первых чисел Фибоначчи.
У ряда есть два варианта, оба встречаются часто, поэтому мы можем выбрать любой. Первый ряд начинается с 0, 1, 1, 2...; второй — с 1, 1, 2, 3...
Пусть у нас будет первый ряд.
n |
Fib(n) |
Sum(Fib(n)) |
0 |
0 |
0 |
1 |
1 |
1 |
2 |
1 |
2 |
3 |
2 |
4 |
4 |
3 |
7 |
5 |
5 |
12 |
6 |
8 |
20 |
7 |
13 |
33 |
8 |
21 |
54 |
9 |
34 |
88 |
Мы видим формулу, про которую сказано в соседнем ответе: Sum(Fib(n)) = Fib(n + 2) - 1
. Я заинтересовался, откуда это известно.
Мне показалось что её легко вывести по индукции.
Предположим, что Sum(Fib(n)) = Fib(n + 2) - 1
для какого то n
.
Тогда Sum(Fib(n + 1)) = Sum(Fib(n)) + Fib(n + 1)
. Если верно первое равенство, то второе равенство равно Fib(n + 2) - 1 + Fib(n + 1)
. Но Fib(n + 1) + Fib(n + 2) = Fib(n + 3)
, следовательно, второе равенство это Fin(n + 3) - 1
. Следовательно, Sum(Fib(n + 1)) = Fib(n + 3) - 1
. Обозначив n + 1 = m
, можем записать его как Sum(Fib(m)) = Fib(m + 2) - 1
.
Шаг индукции мы доказали. Убедимся, что Sum(Fib(n)) = Fib(n + 2) - 1
для n = 0, 1, 2, 3...
Из таблицы выдим, что это так.
Так что да, простейший способ это формула, доказанная по индукции. Либо можете посчитать сумму вручную:
public class MyClass {
static final int N = 9;
public static void main(String args[]) {
int a = 0;
int b = 1;
int sum = a + b;
for (int i = 2; i <= N; i++) {
int t = a;
a = b;
b = t + b;
sum += b;
}
System.out.format("Sum(Fib(%d)) = %d", N, sum); // => 88
}
}
Всё, как в таблице.