斐波纳契数列(Fibonacci Sequence),又称黄金分割数列。
指的是这样一个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每一项都等于前两项之和。
在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci)。
与黄金分割的关系
有趣的是:这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,后一项与前一项的比值的小数部分越来越逼近黄金分割0.618. 1÷1=1,2÷1=2,3÷2=1.5,5÷3=1.666...,8÷5=1.6,…………,89÷55=1.6181818…,…………233÷144=1.618055…75025÷46368=1.6180339889…...
越到后面,这些比值越接近黄金比。
证明:
a[n+2]=a[n+1]+a[n]。
两边同时除以a[n+1]得到:
a[n+2]/a[n+1]=1+a[n]/a[n+1]。
若a[n+1]/a[n]的极限存在,设其极限为x,
则lim[n->;∞](a[n+2]/a[n+1])=lim[n->;∞](a[n+1]/a[n])=x。
所以x=1+1/x。
即x²=x+1。
所以极限是黄金分割比..
如果你看到有这样一个题目:
某人把一个8*8的方格切成四块,拼成一个5*13的长方形,故作惊讶地问你:为什么64=65?
其实就是利用了斐波那契数列的这个性质:5、8、13正是数列中相邻的三项,事实上前后两块的面积确实差1,只不过后面那个图中有一条细长的狭缝,一般人不容易注意到。
在杨辉三角中隐藏着斐波那契数列
斐波那契数列的整除性与素数生成性
每3个数有且只有一个被2整除,
每4个数有且只有一个被3整除,
每5个数有且只有一个被5整除,
每6个数有且只有一个被8整除,
每7个数有且只有一个被13整除,
每8个数有且只有一个被21整除,
每9个数有且只有一个被34整除,
.......
我们看到第5、7、11、13、17、23位分别是素数:5,13,89,233,1597,28657(第19位不是)
斐波那契数列的素数无限多吗?
斐波那契数列的个位数:一个60步的循环
11235,83145,94370,77415,61785.38190,99875,27965,16730,33695,49325,72910…
斐波那契数列中是否存在无穷多个素数?[维基百科]
在斐波那契数列中,有素数:
2,3,5,13,89,233,1597,28657,514229,433494437,2971215073,99194853094755497,1066340417491710595814572169,19134702400093278081449423917……
目前已知最大素数是第81839个斐波那契数,一共有17103位数。
相关的数学问题
1.排列组合
有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
这就是一个斐波那契数列:
登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种登法……
1,2,3,5,8,13……所以,登上十级,有89种走法。
类似的,一枚均匀的硬币掷10次,问不连续出现正面的可能情形有多少种?
答案是(1/√5)*{[(1+√5)/2]^(10+2) - [(1-√5)/2]^(10+2)}=144种。
2.数列中相邻两项的前项比后项的极限
当n趋于无穷大时,F(n)/F(n+1)的极限是多少?
这个可由它的通项公式直接得到,极限是(-1+√5)/2,这个就是黄金分割的数值,也是代表大自然的和谐的一个数字。
3.求递推数列a(1)=1,a(n+1)=1+1/a(n)的通项公式
由数学归纳法可以得到:a(n)=F(n+1)/F(n),将斐波那契数列的通项式代入,化简就得结果。
4.兔子繁殖问题(关于斐波那契数列的别名)
斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔民数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
------ 依次类推可以列出下表:
经过月数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
幼仔对数 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 |
成兔对数 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
总体对数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 | 233 |
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
这个数列是意大利中世纪数学家斐波那契在<;算盘全书>;中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n+1)的性质外,还可以证明通项公式为:an=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}(n=1,2,3.....)`````
可惜本人是文科生,看不懂也不记得那些所谓的数学公式了,以前素材只摘选感兴趣的部分。
来源于百度:http://baike.baidu.com/view/816.htm
我只感兴趣的是后面这几段代码的实现:
- package com.tudou.t1;
- import java.math.BigInteger;
- import java.util.Scanner;
- /**
- * 斐波那契数列 1,2,3,5,8,13,21....[]
- *
- * @author lz
- *
- */
- public class Fibonacci {
- public static void main(String[] args) {
- fib();//常规算法
- System.out.println(compute2(5));//计算第n个斐波那契数列的数
- fibHign();// Java语言程序(高精度,约一秒钟计算第20000个数值)
- }
- private static void fib() {
- int x = 1, y = 1;
- System.out.println(x);
- for (int i = 1; i <= 5; i++) {
- System.out.println(y);
- y = x + y;
- x = y - x;
- }
- }
- // n为第n个斐波那契数列的数
- public static BigInteger compute2(int n) {
- if (n == 1 || n == 2) {
- return BigInteger.ONE;
- }
- BigInteger num1 = BigInteger.ONE;
- BigInteger num2 = BigInteger.ONE;
- BigInteger result = BigInteger.ZERO;
- for (int i = 2; i < n; i++) {
- result = num1.add(num2);
- num2 = num1;
- num1 = result;
- }
- return result;
- }
- // Java语言程序(高精度,约一秒钟计算第20000个数值)
- private static void fibHign() {
- Scanner s = new Scanner(System.in);
- System.out.print("请输入一个整数:");
- int n = s.nextInt();
- do {
- cul(n);
- n = s.nextInt();
- } while (n > 0);// 当n<=0时终止
- }
- private static void cul(int n) {
- BigIntT b = new BigIntT();
- BigIntT a = new BigIntT();
- b.formatBigInt("1");
- a.formatBigInt("2");
- if (n == 1 || n == 2) {
- System.out.println(1);
- return;
- }
- int i = 3;
- for (; i <= n; i++) {
- if (i % 2 > 0)
- b.add(a);
- else
- a.add(b);
- }
- BigIntT t = null;
- if (i % 2 > 0)
- t = b;
- else
- t = a;
- for (int j = t.getPos(); j < 100000; j++)
- System.out.print(t.getBase(j));
- System.out.println();
- }
- }
- class BigIntT {
- int max = 100000;
- private byte[] base = new byte[max];
- private int pos = max;
- public void formatBigInt(String arr) {
- int l = arr.length();
- if (l == 0)
- return;
- int tmp = l - 1;
- for (int i = max - 1; i >= max - l; i--) {
- base[i] = (byte) (arr.charAt(tmp--) - '0');
- pos--;
- }
- }
- public void add(BigIntT right) {
- int bigger = this.getPos() > right.getPos() ? right.getPos() : this
- .getPos();
- pos = bigger;
- for (int i = max - 1; i >= pos - 2; i--) {
- int t = this.base[i] + right.getBase(i);
- if (t >= 10) {
- this.base[i] = (byte) (t % 10);
- this.base[i - 1] += t / 10;
- if (i - 1 < pos)
- pos = i - 1;
- } else {
- this.base[i] = (byte) t;
- }
- }
- }
- public int getPos() {
- return pos;
- }
- public byte getBase(int index) {
- return base[index];
- }
- }
控制台输出结果为:
1 1 2 3 5 8 5
请输入一个整数:500
139423224561697880139724382870407283950070256587697307264108962948325571622863290
691557658876222521294125