小编综合了很多算法相关的书籍以及其他,总结了几种求斐波那契数列的方法

PS:其中的第83行的递归法是求斐波那契数列的经典方法


public class 斐波那契数列 { //迭代法
public static int iteration(int n){ /*此处(包含下面所有方法)声明为静态方法,原因是在本类main()方法中调用
类中方法,对于一般的非static成员变量或方法,需要有一个对象的实例才能调用,所以要先生成对象的实例,他们才会实际的分配内存空间。
而对于static的对象或方法,在程序载入时便已经分配了内存空间,他只和特定的类想关联,无需实例化 */
int result = 1; //最后一个斐波那契数
int a[] = new int[n+1]; //存放斐波那契数,初始值为空,默认全为0
a[0] = 0;
a[1] = 1;
//System.out.println("迭代法计算斐波那契数结果:");
//System.out.print(a[0]+" "+a[1]+" ");
for(int i = 2;i < n+1;i++){
a[i] = a[i-1] + a[i-2];
//result = a[i];
//System.out.print(result+" "); //打印斐波那契数
}
//System.out.println();
result=a[n];
return result; //返回最后一个斐波那契数
} //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数
public static int max_int_iteration(){
int a = 1,b = 1,c = 2;
int count = 3;
for( ;b < c; ){ //一旦c达到编程环境最大斐波那契数,便会产生内存溢出,从而变成一个负数,到此循环结束
a = b;
b = c;
c = a + b;
count++;
}
return count;
} //用迭代法寻找编程环境支持的最大整数(long型)的斐波那契数是第几个斐波那契数
public static long max_long_iteration(){
long a = 1,b = 1,c = 2;
long count = 3;
for( ;b<c; ){ //一旦c达到编程环境最大斐波那契数,便会产生内存溢出,从而变成一个负数,到此循环结束
a = b;
b = c;
c = a + b;
count++;
}
return count;
} //在1,5,10,50秒内使用迭代法算出的最大斐波那契数是第几个
public static void time_iteration(){
int a = 1,b = 1,c = 2;
long count = 3;
long a1 = 0,a2 = 0,a3 = 0,a4 = 0;
long t1 = System.currentTimeMillis();
long t2 = System.currentTimeMillis();
for( ;t2-t1 < 60000; ){
a = b;
b = c;
c = a + b;
count++;
t2 = System.currentTimeMillis();
if(t2-t1 == 1000)
a1 = count;
//System.out.println("1秒内最大斐波那契数是第:"+count+"个 ");
if(t2-t1 == 5000)
a2 = count;
//System.out.println("5秒内最大斐波那契数是第:"+count+"个 ");
if(t2-t1 == 10000)
a3 = count;
//System.out.println("10秒内最大斐波那契数是第:"+count+"个 ");
if(t2-t1 == 50000)
a4 = count;
//System.out.println("50秒内最大斐波那契数是第:"+count+"个 ");
}
System.out.println("迭代法1秒内最大斐波那契数是第:"+a1+"个 ");
System.out.println("迭代法5秒内最大斐波那契数是第:"+a2+"个 ");
System.out.println("迭代法10秒内最大斐波那契数是第:"+a3+"个 ");
System.out.println("迭代法50秒内最大斐波那契数是第:"+a4+"个 ");
} //递归法
public static long recursion(long n){
long result = 0; //最后一个斐波那契数及存储中间斐波那契数的变量
if(n <= 0)
result = 0;
if(n == 1 || n == 2)
result = 1;
if(n > 2)
{
result = recursion(n-1) + recursion(n-2);
//System.out.print(result+" ");
}
return result;
} //规定时间内,递归法计算出的最大斐波那契数是第几个
public static int recursion_time(long time){
long starttime_dg=System.currentTimeMillis();
int i=3;
long endtime_dg=0;
while(endtime_dg<starttime_dg+time*1000){
endtime_dg=System.currentTimeMillis();
i++;
recursion(i);
}
return i;
} //递归法在1,5,10,50秒内算出的最大斐波那契数是第几个
public static void fbnq_recursion_time(){ System.out.println("1秒内最大斐波那契数是第:"+recursion_time(1)+"个 "); System.out.println("5秒内最大斐波那契数是第:"+recursion_time(5)+"个 "); System.out.println("10秒内最大斐波那契数是第:"+recursion_time(10)+"个 "); System.out.println("50秒内最大斐波那契数是第:"+recursion_time(50)+"个 "); } //测试递归法在1,5,10,50秒内使用迭代法算出的最大斐波那契数是第几个
public static void time_recursion_test(){
long t1 = System.currentTimeMillis();
long t2 = 0;
int i = 3;
for(;t2-t1 > 60000;){
recursion(i);
i++;
t2 = System.currentTimeMillis();
if(t2-t1 == 1000)
System.out.println("1秒内最大斐波那契数是第:"+i+"个 ");
if(t2-t1 == 5000)
System.out.println("5秒内最大斐波那契数是第:"+i+"个 ");
if(t2-t1 == 10000)
System.out.println("10秒内最大斐波那契数是第:"+i+"个 ");
if(t2-t1 == 50000)
System.out.println("50秒内最大斐波那契数是第:"+i+"个 "); }
} //直接求值法(利用公式F(n) = [@n/sqrt(5)]快速计算第n个斐波那契数)
public static double formula(int n){
double result = 0;
double temp = Math.sqrt(5.0);
result = (1/temp)*(Math.pow((1+temp)/2,n)-Math.pow((1-temp)/2, n));
return result;
} //利用直接求值法,出现误差时最小的n值
public static int min_formula(){
double result_fn=1;
int i=1;
while(result_fn-(double)iteration(i)<1){
result_fn=formula(i);
i++;
}
return i;
} //新算法法
public static int new_way(int n){
//int a = 1,b = 1,c = 2,d = 3;
int result = 0; //定义最后一个斐波那契数
//根据输入n,求出最后一个斐波那契数
if(n == 0)
result = 0;
else if(n == 1 || n == 2)
result = 1;
else if(n == 3)
result = 2;
else if(n >= 4){ //若n大于4返回resul
int a1 = n/4;
int b1 = n%4;
int a = new_way(a1);
int b = new_way((a1+1));
int c = new_way((a1-1));
int d = new_way((a1+2));
if(b1 == 0)
result = (int) ((Math.pow(b,2) - Math.pow(c,2))*(Math.pow(c, 2) + 2*Math.pow(a, 2) + Math.pow(b,2)));
if(b1 == 1)
result = (int) (Math.pow((Math.pow(b,2) - Math.pow(c,2)),2) + Math.pow((Math.pow(a, 2) + Math.pow(b,2)),2));
if(b1 == 2)
result = (int) ((Math.pow(a, 2) + Math.pow(b,2))*(3*Math.pow(b,2)+Math.pow(a, 2)-2*Math.pow(c,2)));
if(b1 == 3)
result = (int) (Math.pow((Math.pow(a, 2) + Math.pow(b,2)),2) + Math.pow((Math.pow(d,2)-Math.pow(a,2)),2)); }
return result;
} // 关联矩阵
private static final int[][] UNIT = { { 1, 1 }, { 1, 0 } };
// 全0矩阵
private static final int[][] ZERO = { { 0, 0 }, { 0, 0 } };
/**
* 求斐波那契数列
*
* @param n
* @return
*/
public static int[][] fb(int n) {
if (n == 0) {
return ZERO;
}
if (n == 1) {
return UNIT;
}
// n是奇数
if ((n & 1) == 0) {
int[][] matrix = fb(n >> 1);
return matrixMultiply(matrix, matrix);
}
// n是偶数
int[][] matrix = fb((n - 1) >> 1);
return matrixMultiply(matrixMultiply(matrix, matrix), UNIT);
} /**
* 矩阵相乘
*
* @param m
* r1*c1
* @param n
* c1*c2
* @return 新矩阵,r1*c2
*/
public static int[][] matrixMultiply(int[][] m, int[][] n) {
int rows = m.length;
int cols = n[0].length;
int[][] r = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
r[i][j] = 0;
for (int k = 0; k < m[i].length; k++) {
r[i][j] += m[i][k] * n[k][j];
}
}
}
return r;
} //具体实现矩阵相乘算法
public static int matrix(int n){
int[][] m = fb(n);
return m[0][1];
} public static void main(String[] args){
System.out.print(max_int_iteration());
System.out.println();
System.out.print(max_long_iteration());
System.out.println();
System.out.println();
long t1 = System.currentTimeMillis();
long a = recursion(47);
long t2 = System.currentTimeMillis();
System.out.println("递归法求斐波那契数:");
System.out.println(a);
System.out.println("递归算法Time is: " + (t2 - t1)/1000.0+"秒"); //此处下面可以直接通过给相关类传递参数,实现相应功能,上面的中代码仅仅提供示例
} }

Java实现斐波那契数列的多种方法的更多相关文章

  1. Java-Runoob-高级教程-实例-方法:04. Java 实例 – 斐波那契数列

    ylbtech-Java-Runoob-高级教程-实例-方法:04. Java 实例 – 斐波那契数列 1.返回顶部 1. Java 实例 - 斐波那契数列  Java 实例 斐波那契数列指的是这样一 ...

  2. 【Java】斐波那契数列(Fibonacci Sequence、兔子数列)的3种计算方法(递归实现、递归值缓存实现、循环实现、尾递归实现)

    斐波那契数列:0.1.1.2.3.5.8.13………… 他的规律是,第一项是0,第二项是1,第三项开始(含第三项)等于前两项之和. > 递归实现 看到这个规则,第一个想起当然是递归算法去实现了, ...

  3. java大数 斐波那契数列

    java大数做斐波那契数列:  思路:1.       2.可以用数组存着 import java.math.BigInteger; import java.util.Scanner; public ...

  4. Java:斐波那契数列

    斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...

  5. Java实现斐波那契数列Fibonacci

    import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO ...

  6. 用java实现斐波那契数列

    斐波那契数列源于数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入的计算问题.假设某种兔子兔子,出生第一个月变成大兔子,大兔子再过一个月能生下一对小兔子,且一年 ...

  7. Java 实现斐波那契数列

    public class Fibonacci { private static int getFibo(int i) { if (i == 1 || i == 2) return 1; else re ...

  8. java递归 斐波那契数列递归与非递归实现

    递归简单来说就是自己调用自己, 递归构造包括两个部分: 1.定义递归头:什么时候需要调用自身方法,如果没有头,将陷入死循环 2.递归体:调用自身方法干什么 递归是自己调用自己的方法,用条件来判断调用什 ...

  9. Go斐波拉契数列(Fibonacci)(多种写法)

    1 前言 斐波拉契数列有递归写法和尾递归和迭代写法. 2 代码 //recursion func fib(n int) int{ if n < 2{ return n }else{ return ...

随机推荐

  1. calc less 下不起作用

    在 less中不能使用css3 calc属性不能 css3 新增长度计算属性 可以根据不同单位计算宽度 .test{ width: calc(100% - 150px); } 但是当我们在less中使 ...

  2. linux --vim 补充 .vimrc

    1.今天发现了一个新的功能.vimrc 1.这个是一个个人配置文件,可以在这个里面首先对vim进行一些设置呢 如果系统没有.vimrc文件,可以自己创建一个,touch .vimrc 举个栗子,我在. ...

  3. 大技霸教你远程执行Linux脚本和命令

    如果现在需要在 Linux 服务器上执行一系列命令(比如搭建 LNMP 环境)我应该会第一时间想到想办法写个 Shell 脚本,然后扔上去执行以下看看结果. 然而一贯懒惰的我并不想这么去执行 Shel ...

  4. The Apache Tomcat Connector

    http://tomcat.apache.org/connectors-doc/generic_howto/quick.html 搭建最简单的tomcat connector 用到了apapche 的 ...

  5. 【雕爷学编程】Arduino动手做(57)---四档矩形波模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  6. 数据结构----栈stack

    栈的概念与数据结构 栈(有时称为“后进先出栈”)是一个元素的有序集合,其中添加移除新元素总发生在同一端.这一端通常称为“顶部”.与顶部对应的端称为“底部”.栈的底部很重要,因为在栈中靠近底部的元素是存 ...

  7. storm-jdbc详解

    今天来说说Storm集成Jdbc是如何完成的,代码如下: 写入数据: 先来讲讲官方API: Map hikariConfigMap = Maps.newHashMap(); hikariConfigM ...

  8. MVC4.0接口学习

    /// <summary> /// 正则验证身份证号是否合法 /// </summary> /// <param name="sIdCard"> ...

  9. js动态添加iframe,自适应页面宽高

    function showIframe(url,w,h){ //添加iframe var if_w = w; var if_h = h; $("<iframe width='" ...

  10. 一篇文教你使用python Turtle库画出“精美碎花小清新风格树”快来拿代码!

    Turtle库手册可以查询查询 python图形绘制库turtle中文开发文档及示例大全,手册中现有示例,不需要自己动手就可以查看演示. 使用Turtle画树,看了一下网上的代码,基本上核心的方法是使 ...