斐波那契数列

来源:互联网 发布:网络用语古是什么意思 编辑:程序博客网 时间:2024/05/29 10:53

大家在高中学习数学的时候,也许都接触过 斐波那契 数列:

1,1,2,3,5,8......

也就是说,除了第一个和第二个元素外,后面的元素的值均为其前两个元素值的和。但在我印象中,老师从来没有介绍过这个数列的通项公式(即一个数学表达式能清晰的表达出它的规律)。到了大学的时候,作为电子或者计算机相关学科的同学们,会学习C语言的相关知识,那个时候,典型的编程题,也会拿 斐波那契 数列举例。

首先,我们可以根据斐波那契数列的规律,得出它的推导公式:


然后,我们根据推导公式,很容易用C语言实现其算法

int result(int index) {    if (index == 1 || index == 2) {        return 1;    }    return result(index - 1) + result(index - 2);}

紧接着的工作就是调用即可:

int main(int argc, const char * argv[]) {        clock_t start = clock();    printf("%d\n", result(45));    clock_t end = clock();        double duration = (double)(end - start);    printf( "%f seconds\n", duration / CLOCKS_PER_SEC);    return 0;}

我们可以尝试传入不同的数值,便可以得到相应的结果。但是如上例中,当我尝试得到 斐波那契 数列的第45个位置的值时,耗时很久; 那是因为以上算法,采用的是递归算法;效率低下。 打印结果如下:



从上面的推导公式,可以看出来,我们并没有得到Fn关于n的函数,即通项公式。 上面只是利用计算机强行进行计算;但我们可以从数学的角度进一步分析 斐波那契 数列,即尝试得到它的通项公式!!!

一、 我们假设数列的生成函数如下:


其中 F1, F2, F3, F4... 就是斐波那契数列的值, 这里为1,1,2,3...

二、 将上面式子分别乘以 x 和 x的平方,结果如下:‘


三、 将上面式子,第一个 + 第二个 - 第三个

得到左边的结果:’


得到右边的结果:


而根据文章一开头的推导公式,我们知道 从 x的三次方之后, 其系数结果均为0, 所有右边的最终结果就是 -F1*x, 而F1的值是1, 所有右边的结果就是 -x.

综上所述,我们可以得到 斐波那契 数列的生成函数:


四、 根据高中知识,我们可以知道,多次表达式的分数形式可以转化为低次表示式的和的形式


进一步可以得到:


然后将结果带入公式,去除掉 R 和 S,可得:


五、 级数展开公式

根据大学级数公式,我们可知:


带入第四步中的公式可得:


于是,我们得到了 斐波那契 数列的通项公式为:


而 r 与 s又满足条件:


所以可以计算得出:


因为,我们最终可以得出 斐波那契 数列的通项公式为:



此时,我们使用C语言重新实现,代码如下:

int result2(int index) {    return (int)(((pow((1 + sqrt(5.0)) / 2, index) - pow((1 - sqrt(5.0)) / 2, index)) / sqrt(5.0)));}

然后观察打印结果:


可以看出,计算结果一直,但是运行时间却快了六万多倍。。。


从这里,我们可以看出,在实现编程的时候,可以首先考虑利用数学方法优化程序设计或者计算!!!!

0 0
原创粉丝点击