第N个偶斐波那契数

原文地址:Nth Even Fibonacci Number
已知一个n,找到第n个偶斐波那契数。

Input  : n  = 3
Output : 34

Input  : n  = 4
Output : 144

Input : n = 7
Output : 10946

下面的数字序列就是斐波那契数列:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ….

对于序列中任意一个数字有:

 Fn = Fn-1 + Fn-2 
      with seed values
      F0 = 0 and F1 = 1.

偶数的斐波那契数列是:0, 2, 8, 34, 144, 610, 2584….,我们要找的是这个序列的第n个数字。

如果我们再仔细看下这个斐波那契数列,我们就可以注意到在这个序列中每隔三个数字就出现一个偶数,而且偶数的序列可以用下面的递归式子表示。

偶斐波那契数列的递归描述为:
     EFn = 4EFn-1 + EFn-2
with seed values
     EF0 = 0 and EF1 = 2.
EFn表示偶斐波那契数列的第n个项。

上面的式子是如何工作的呢?

我们先看下原来的斐波那契公式,用这样的方法写写Fn-3与Fn-6,因为事实上每三个斐波那契数就出现一个偶数。

Fn = Fn-1 + Fn-2 [Expanding both terms]
   = Fn-2 + Fn-3 + Fn-3 + Fn-4 
   = Fn-2 + 2Fn-3 + Fn-4 [Expending first term]
   = Fn-3 + Fn-4 + 2Fn-3 + Fn-4
   = 3Fn-3 + 2Fn-4  [Expending one Fn-4]
   = 3Fn-3 + Fn-4 + Fn-5 + Fn-6 [Combing Fn-4 and Fn-5]
   = 4Fn-3 + Fn-6  

因为每隔三个斐波那契数就出现一个偶数, 所以如果Fn是偶数,那么Fn-3就是偶数,Fn-6也是偶数。假设Fn是第x个偶数,并将其标记为EFx。
如果Fn是EFx,那么Fn-3就是前一个偶数。例如EFx-1与Fn-6是EFx-1前面的元素。例如EFx-2
所以
Fn = 4Fn-3 + Fn-6
也就是说
EFx = 4EFx-1 + EFx-2

下面是上述递归公式的C++实现。

// Even Fibonacci Series using normal Recursion
#include<iostream>
using namespace std;

/* Function which return nth even fibonnaci number */
long int evenFib(int n)
{
    if (n < 1)
       return n;
    if (n == 1) 
       return 2;

    // calculation of Fn = 4*(Fn-1) + Fn-2
    return ((4*evenFib(n-1)) + evenFib(n-2));  
}

/* Driver program */
int main ()
{
    int n = 7;
    cout << evenFib(n);  
    return 0;
}

输出:

10946

上述实现的时间复杂度是指数级的。我们可以用动态规划在线性的时间内解决这个问题,我们也可以用EFn = F3n在O(Log n)的时间内得到答案。注意我们可以在O(Log n)的时间内找到第n个斐波那契数。请看这里的方法5和方法6。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值