Think in Java之斐波那契数列

斐波纳契数列(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

我只感兴趣的是后面这几段代码的实现:

  1. package com.tudou.t1;  
  2.  
  3. import java.math.BigInteger;  
  4. import java.util.Scanner;  
  5.  
  6. /**  
  7.  * 斐波那契数列 1,2,3,5,8,13,21....[]  
  8.  *   
  9.  * @author lz  
  10.  *   
  11.  */ 
  12. public class Fibonacci {  
  13.     public static void main(String[] args) {  
  14.         fib();//常规算法  
  15.         System.out.println(compute2(5));//计算第n个斐波那契数列的数  
  16.         fibHign();// Java语言程序(高精度,约一秒钟计算第20000个数值)  
  17.     }  
  18.  
  19.     private static void fib() {  
  20.         int x = 1, y = 1;  
  21.         System.out.println(x);  
  22.         for (int i = 1; i <= 5; i++) {  
  23.             System.out.println(y);  
  24.             y = x + y;  
  25.             x = y - x;  
  26.         }  
  27.     }  
  28.  
  29.     // n为第n个斐波那契数列的数  
  30.     public static BigInteger compute2(int n) {  
  31.         if (n == 1 || n == 2) {  
  32.             return BigInteger.ONE;  
  33.         }  
  34.         BigInteger num1 = BigInteger.ONE;  
  35.         BigInteger num2 = BigInteger.ONE;  
  36.         BigInteger result = BigInteger.ZERO;  
  37.         for (int i = 2; i < n; i++) {  
  38.             result = num1.add(num2);  
  39.             num2 = num1;  
  40.             num1 = result;  
  41.         }  
  42.         return result;  
  43.     }  
  44.  
  45.     // Java语言程序(高精度,约一秒钟计算第20000个数值)  
  46.     private static void fibHign() {  
  47.         Scanner s = new Scanner(System.in);  
  48.         System.out.print("请输入一个整数:");  
  49.         int n = s.nextInt();  
  50.         do {  
  51.             cul(n);  
  52.             n = s.nextInt();  
  53.         } while (n > 0);// 当n<=0时终止  
  54.     }  
  55.  
  56.     private static void cul(int n) {  
  57.         BigIntT b = new BigIntT();  
  58.         BigIntT a = new BigIntT();  
  59.         b.formatBigInt("1");  
  60.         a.formatBigInt("2");  
  61.         if (n == 1 || n == 2) {  
  62.             System.out.println(1);  
  63.             return;  
  64.         }  
  65.         int i = 3;  
  66.         for (; i <= n; i++) {  
  67.             if (i % 2 > 0)  
  68.                 b.add(a);  
  69.             else 
  70.                 a.add(b);  
  71.         }  
  72.         BigIntT t = null;  
  73.         if (i % 2 > 0)  
  74.             t = b;  
  75.         else 
  76.             t = a;  
  77.         for (int j = t.getPos(); j < 100000; j++)  
  78.             System.out.print(t.getBase(j));  
  79.         System.out.println();  
  80.     }  
  81. }  
  82.  
  83. class BigIntT {  
  84.     int max = 100000;  
  85.     private byte[] base = new byte[max];  
  86.     private int pos = max;  
  87.  
  88.     public void formatBigInt(String arr) {  
  89.         int l = arr.length();  
  90.         if (l == 0)  
  91.             return;  
  92.         int tmp = l - 1;  
  93.         for (int i = max - 1; i >= max - l; i--) {  
  94.             base[i] = (byte) (arr.charAt(tmp--) - '0');  
  95.             pos--;  
  96.         }  
  97.     }  
  98.  
  99.     public void add(BigIntT right) {  
  100.         int bigger = this.getPos() > right.getPos() ? right.getPos() : this 
  101.                 .getPos();  
  102.         pos = bigger;  
  103.         for (int i = max - 1; i >= pos - 2; i--) {  
  104.             int t = this.base[i] + right.getBase(i);  
  105.             if (t >= 10) {  
  106.                 this.base[i] = (byte) (t % 10);  
  107.                 this.base[i - 1] += t / 10;  
  108.                 if (i - 1 < pos)  
  109.                     pos = i - 1;  
  110.             } else {  
  111.                 this.base[i] = (byte) t;  
  112.             }  
  113.         }  
  114.     }  
  115.  
  116.     public int getPos() {  
  117.         return pos;  
  118.     }  
  119.  
  120.     public byte getBase(int index) {  
  121.         return base[index];  
  122.     }  
  123. }  

控制台输出结果为:

1 
1 
2 
3 
5 
8 
5

请输入一个整数:500

139423224561697880139724382870407283950070256587697307264108962948325571622863290

691557658876222521294125

转载于:https://www.cnblogs.com/orion/archive/2012/04/15/2450298.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《论道HTML5》内容技术分享活动

HTML5小组的第12次活动&#xff0c;本期沙龙围绕5月出版的《论道HTML5》重点章节内容展开&#xff0c;由我和另外一位作者秀野堂主现场分享。欢迎大家参加&#xff0c;下面是活动的详细信息。活动介绍&#xff1a;时间&#xff1a;2012年04月21日 13:30-18:00地址&#xff1a;东…

基于SpringBoot实现一个可扩展的事件总线

基于SpringBoot实现一个可扩展的事件总线 前言 在日常开发中&#xff0c;我们经常会用到事件总线&#xff0c;SpringBoot通过事件多播器的形式为我们提供了一个事件总线&#xff0c;但是在开发中我们经常会用到其他的实现&#xff0c;比如Guava、Disruptor的。我们将基于Spri…

大数据技术之 Kafka (第 1 章 Kafka 概述)

第 1 章 Kafka 概述 1.1 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 1.2 消息队列 1.2.1 传统消息队列的应用场景 MQ传统应用场景之异步处理 使用消息队列的好处 1&a…

那些你无比崇拜的厉害人,是如何建构知识体系的

那些你无比崇拜的厉害人&#xff0c;是如何建构知识体系的&#xff1f; 2018-04-04 六合同风 文 | Lachel 高效思维达人&#xff0c;知识管理专家&#xff0c;深度思考践行者&#xff0c;领英、36氪特约作家 来源 | L先生说&#xff08;ID&#xff1a;lxianshengmiao&#x…

大数据技术之 Kafka (第 2 章 Kafka快速入门)

第 2 章 Kafka 快速入门 下载安装kafka集群 1.需要jdk 2.需要zookeeper&#xff0c;这个东西在最新版的Kafka中内置。 3.下载Kafka安装包 &#xff08;下载官网地址&#xff1a;Apache Kafka&#xff09; 一&#xff0c;下载Kafka安装包 二&#xff0c;Kafka安装包上传li…

使用ICSharpCode.TextEditor制作一个语法高亮显示的XML编辑器

本文转载&#xff1a;http://www.cnblogs.com/lefay/archive/2010/07/25/1784919.html转载于:https://www.cnblogs.com/51net/archive/2012/04/21/2462431.html

文因互联 CEO 鲍捷:确保搞砸人工智能项目的十种方法

文因互联 CEO 鲍捷&#xff1a;确保搞砸人工智能项目的十种方法 原文链接 原创&#xff1a; 鲍捷 文因互联 前天 做成一件事儿不容易&#xff0c;而坑恒在。 鲍捷博士于5月10日在将门创投的线上 talk 中盘点了人工智能项目的大坑小坑&#xff0c;选出了看上去非常反常识的十…

启动kafka失败报内存不足(Cannot allocate memory)

原因分析&#xff0c;因为我的虚拟机内存一共才1G 查看一下我的虚拟机内存还剩余多少&#xff1f; 天呐&#xff0c;我的只有60M了 我们看下kafka的启动脚本 vim kafka-server-start.sh 看见下面的脚本文件内容没有&#xff0c;默认是1G&#xff0c;而我只有60M&#xff0…

Introduce Null Object(引入Null对象)

Introduce Null Object&#xff08;引入Null对象&#xff09;你需要再三检查某对象是否为null。将null值替换为null对象。if (customer null) plan BillingPlan.basic(); else plan customer.getPlan(); 动机多态的最根本好处在于&#xff1a;你不必再向对象询问"你是…

zookeeper Error contacting service. It is probably not running

通过命令zkServer.sh start之后&#xff0c;显示STARTED 通过client测试报错 无法连接 连接关闭 Connecting to localhost:2181 2020-03-29 12:44:31,855 [myid:] - INFO [main:Environment100] - Client environment:zookeeper.version3.4.13-2d71af4dbe22557fda74f9a9b430…

引言

推荐系统从0到1_引言什么是推荐&#xff1f;什么是推荐系统&#xff1f;推荐系统的应用什么是推荐&#xff1f; 说起推荐&#xff0c;就不得不说搜索。搜索这里指信息检索&#xff0c;在大量的信息中&#xff0c;我们需要找到自己需要的信息&#xff0c;就用到了搜索引擎&…

JNI的方式调用DLL(SO)(上)

最近有个项目要调用原有的DLL文件&#xff0c;本来准备使用JNA&#xff0c;可是客户不同意&#xff0c;非要使用JNI的方式。万般无奈之下&#xff0c;只能重新使用JNI&#xff0c;现将JAVA调用动态链接库的一般方法总结如下。 JNI是Java Native Interface&#xff08;JAVA本地调…

搭建推荐系统所需要的材料

搭建推荐系统所需要的材料人力物力推荐系统的原材料物品流量最后人力物力 在上一小节中《推荐系统的必要性》里已经讨论过一个推荐业务团队需要哪些人员储备&#xff0c;需要什么核心技术等。这里在重点说下物力&#xff0c;即机器资源设备。 往往从头开始搭建这样一个团队&a…

kafka:topic为什么要进行分区?副本机制是如何做的?

kafka为什么要在topic里加入分区的概念&#xff1f;如果没有分区,topic中的segment消息写满后,直接给订阅者不是也可以吗&#xff1f; Kafka可以将主题划分为多个分区&#xff08;Partition&#xff09;&#xff0c;会根据分区规则选择把消息存储到哪个分区中&#xff0c;只要如…

将某字符串切割成阵列并排序列出

老师布置的另外一道题是将字符串"a;b;d;z;y;u"切割成阵列并排序列出。老师出这题也许是让Insus.NET掌握或复习Array.Sort()函数&#xff0c;不管怎样&#xff0c;先按自己的想法实现&#xff0c;然后是等老师的意见。protected void Page_Load(object sender, EventA…

关于管理,这5大误区你越早知道越好

关于管理&#xff0c;这5大误区你越早知道越好 原创&#xff1a; 陈春花 管理的常识 绝大部分人都感觉自己已经非常努力地工作&#xff0c;但结果却不尽如人意&#xff0c;到底问题出在哪里&#xff1f; 就让北京大学国家发展研究院管理学教授、北大国发院BiMBA商学院院长陈春…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Log存储解析

Kafka 工作流程 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partition 对应于一个 log 文件&#xff0c;该 log…

推荐系统整体框架概览

推荐系统整体框架概览推荐系统整体架构 推荐系统的核心组成部分离线核心节点服务UI总结推荐系统整体架构 先说点题外话&#xff0c;最近在看的书中讲到了怎么进行自学的方法&#xff0c;分了十个层级。第一个便是要了解所学内容的概况&#xff0c;也就是轮廓&#xff0c;大的东…

大数据技术之 Kafka (第 3 章 Kafka 架构深入 ) Kafka 生产者

3.2.1 分区策略 1&#xff09;分区的原因 &#xff08;1&#xff09;方便在集群中扩展&#xff0c;每个 Partition 可以通过调整以适应它所在的机器&#xff0c;而一个 topic又可以有多个 Partition 组成&#xff0c;因此整个集群就可以适应任意大小的数据了&#xff1b; &a…