正文

[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;
}

阅读(6078) | 评论(1)


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

评论

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