正文

[030] Fibonacci数列与黄金分割2006-03-09 22:11:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/10859.html

分享到:

<谭> 6.7 求Fibonacci数列的前40个数。该数列有如下特点: 第1, 2两个数为1,1。从第3个数开始,每个数等于前2个数之和。生成方法为:F1=1                  (n=1)F2=1                  (n=2)Fn=Fn-1+Fn-2           (n>=3) #include <stdio.h>int main(){    long int f1, f2; /* 作为循环体的"前两项",会超过32767,所以用long */    int i;           /* 计数 */    f1 = 1; f2 = 1;    for (i = 1; i <= 20; i++)          /* 循环一次输出2个,共进行20次 */    {        printf("%12ld %12ld", f1, f2); /* 第22个数之后值超过32767,必须用ld,而非d */        if ( i % 2 == 0)               /* 每次输出两个, 两次输出4个, 便换行 */        printf("\n");                  /* 控制换行 */        f1 = f1 + f2;                  /* 计算下两个数 */        f2 = f1 + f2;        }    return 0;}运行结果:========================================================           1            1           2            3           5            8          13           21          34           55          89          144         233          377         610          987        1597         2584        4181         6765       10946        17711       28657        46368       75025       121393      196418       317811      514229       832040     1346269      2178309     3524578      5702887     9227465     14930352    24157817     39088169    63245986    102334155========================================================★ 小知识(摘录):    斐波那契是意大利的数学家。他是一个商人的儿子。儿童时代跟随父亲到了阿尔及利亚,在那里学到了许多阿拉伯的算术和代数知识,从而对数学产生了浓厚的兴趣。  长大以后,因为商业贸易关系,他走遍了许多国家,到过埃及、叙利亚、希腊、西西里和法兰西。每到一处他都留心搜集数学知识。回国后,他把搜集到的算术和代数材料,进行研究、整理,编写成一本书,取名为《算盘之书》,于1202年正式出版。  这本书是欧洲人从亚洲学来的算术和代数知识的整理和总结,它推动了欧洲数学的发展。其中有一道“兔子数目”的问题是这样的:一个人到集市上买了一对小兔子,一个月后,这对小兔子长成一对大兔子。然后这对大兔子每过一个月就可以生一对小兔子,而每对小兔子也都是经过一个月可以长成大兔子,长成大兔后也是每经过一个月就可以生一对小兔子。那么,从此人在市场上买回那对小兔子算起,每个月后,他拥有多少对小兔子和多少对大兔子?  这是一个有趣的问题。当你将小兔子和大兔子的对数算出以后,你将发现这是一个很有规律的数列,而且这个数列与一些自然现象有关。人们为了纪念这位兔子问题的创始人,就把这个数列称为“斐波那契数列”。 又找到了这么一段话:规律表: 月数 小兔 中兔 老兔 总数 1    1    0    0    1 2    0    1    0    1 3    1    0    1    2 4    1    1    1    3 5    2    1    2    5 6    3    2    3    8 7    5    3    5   13     在计算每一行时,大兔数为上月的大兔数加上月的中兔数,中兔数为上月的小兔数,小兔数为本月的大兔数,算总数为本月的小兔数加本月的中兔数加本月的大兔数。在观察总数的过程中找出了规律:总数的第一、二月都是1,以后的每一月是前两月的和。数列为1,1,2,3,5,8,13,21,34,55,……    当n=50时,后项与前项的比是1.61803398874989,而前项与后项的比是0.61803398874989,即b/a的值与a/b的值相差1,假设后项与前项的比是φ,则有(φ-1)/φ=1,解这个方程得:φ= (√5+1) /2,这就是黄金分割。    当n充分大时,斐波纳契数列后前项的比值,与前后项的比值,相差1,它们的比值是黄金分割!黄金分割是一个十分有用的无理数。据此,把黄金分割可用一个有理数近似表示,如斐波纳契数列的第七项与斐波纳契数列的第六项的比13/8,斐波纳契数列的第九项与斐波纳契数列的第八项的比34/21等都可以近似地表示为黄金分割,当然项数越后越精确。 验证一下:#include <stdio.h>int main(){    long double f1, f2;    int i;    f1 = 1; f2 = 1;    for (i = 1; i <= 25; i++)    {        f1 = f1 + f2;        f2 = f1 + f2;    }    printf("%lf\n", (long double)f2/f1);    return 0;}运行结果:==============1.618034==============★ 经验证, 如果使用该程序,若循环7次,即: i<=7,则结果为1.618033,循环8次以上(有效范围内),均为1.618034, 由于"对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位", 也不知如何才能显示更多的小数位,用"老刑"的话说就是"这个事我很费解啊". 先搁这儿吧,有空再研究……######################################数组########################################今天看到数组这章了,有个例子就是用数组实现斐波那契数列的,补上……#include <stdio.h>int   main(){    int i;    int f[20] = {1,1};    for (i = 2; i < 20; i++)        f[i] = f[i-2] + f[i-1];    for (i = 1; i <= 20; i++)    {         printf("%8d", f[i-1]);        if (i % 5 == 0)            printf("\n");     }    return 0;}

阅读(6220) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册