问题描述
- 斐波那契数列 利用循环输出前40项 (初学者)
-
我在查了资料之后找到以下解决方法:
#include
int main()
{
long fib[41] = {0,1};
int i;
for (i=2;i<41;i++) fib[i] = fib[i-1]+fib[i-2];
for (i=1;i<41;i++) printf("F%d==%dn",i,fib[i]);
getch();
return 0;
}有些看不懂,希望可以帮我详细分析一下运算过程,或者提供相关的知识点以供研究。
谢谢。
解决方案
首先你要知道斐波那契数列的规律也就是0、1、1、2、3、5、8、13、21、……,通过这个就可以知道从第三个元素开始,他的值等于前面两个元素的和,下面分析代码
long fib[41] = {0,1}; 定义了一个数组,设置了0 1 坐标元素的值为 0 1
for (i=2;i<41;i++) fib[i] = fib[i-1]+fib[i-2]; 这个循环是冲i等于2开始运算的,也就是数组的第三个元素,fib[i] = fib[i-1]+fib[i-2] 因为斐波那契数列的规律是从第三个元素开始等于前面两个相加,也就是fib[i-1],fib[i-2]这两个
for (i=1;i<41;i++) printf("F%d==%dn",i,fib[i]); 这里是打印,上面的代码可以看出,数组第一个和第二个元素没有参与运算,但long fib[41] = {0,1};这里已经声明了,所以第一个第二个元素固定为0、1,第三个开始就是前面两个相加。
不知道说的详细不详细,你明白不明白。
解决方案二:
这样实现的效率不高,计算40项表现不出来,如果计算400项的时候,那就会发现非常慢。
long main(int n){
if(n > 1){
long a = 0, b = 1;
do{
long temp = b;
b += a;
a = temp;
}while(--n > 1);
return b;
}
return n;
}
看是简单的“杯子倒水”、看是没有什么技术含量,但是他的效率绝对比迭代来得高。
解决方案三:
这个是迭代法,如果你想要深入探讨的话,可以去研究高效的矩阵乘法。
解决方案四:
long a = 0;
long b = 1;
int count = 40;
for (int i = 0; i < (count+1)/2; i++) {
b = a + b;
a = a + b;
}
这样效率更高些