您的位置:首页 > 编程语言 > C语言/C++

斐波那契数列

2016-02-21 11:22 387 查看
本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。

大家在高中学习数学的时候,也许都接触过 斐波那契 数列:
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)));
}
然后观察打印结果:



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

从这里,我们可以看出,在实现编程的时候,可以首先考虑利用数学方法优化程序设计或者计算!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息