斐波那契问题(java)

F(n)=F(n-1)+F(n-2)

1.迭代实现,O(2的N次方)

 1 /**
 2      * 斐波那契 迭代实现
 3      * @param n
 4      * @return
 5      */
 6     public int Fabonacci_1(int n){
 7         if(n<0)return 0;
 8         if(n==1||n==2) return 1;
 9         return Fabonacci_1(n-1)+Fabonacci_1(n-2);
10     }

2.递归实现,O(N)

 1 /**
 2      * 斐波那契 递归实现
 3      * @param n
 4      * @return
 5      */
 6     public int Fabonacci_2(int n){
 7         if(n<0)return 0;
 8         if(n==1||n==2) return 1;
 9         int res = 1,pre=1,temp=0;
10         for(int i=3;i<=n;i++){
11             temp = res;
12             res = res+pre;
13             pre = temp;
14         }
15         return res;
16     }

3.使用二阶矩阵实现,O(logN)

 1 /**
 2      * 斐波那契 二阶矩阵实现
 3      * @param n
 4      * @return
 5      */
 6     public int Fabonacci_3(int n){
 7         if(n<0)return 0;
 8         if(n==1||n==2) return 1;
 9         int[][] base={{1,1},{1,0}};
10         int[][] res = matrixPower(base, n-2);
11         return res[0][0]+res[1][0];
12     }
13
14     //使用二阶矩阵求 斐波那契
15
16     public int[][] matrixPower(int[][] m,int p){
17         int[][] res = new int[m.length][m[0].length];
18         //设置res为单位矩阵
19         for(int i=0;i<res.length;i++){
20             res[i][i]=1;
21         }
22
23         int[][] temp = m;
24         for(;p!=0;p>>=1){
25             if((p&1)!=0){
26                 muliMatrix(res, temp);
27             }
28             muliMatrix(temp, temp);
29
30         }
31         return res;
32     }
33
34
35     //2个矩阵相乘
36     public int[][] muliMatrix(int[][] m1,int[][] m2){
37         int[][] res = new int[m1.length][m2[0].length];
38         for(int i=0;i<m1.length;i++){
39             for(int j=0;j<m2[0].length;j++){
40                 for(int k=0;k<m2.length;k++){
41                     res[i][j] += m1[i][k]*m2[k][j];
42                 }
43             }
44         }
45         return res;
46     }
时间: 2024-12-31 19:57:01

斐波那契问题(java)的相关文章

用HashMap优化斐波那契数列 java算法

斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times=0; public static void main(String args[]){ int nums = fibonacci(30); System.out.println("结果:"+nums); System.out.println("次数:"+times);

如何打印斐波拉契数列以及质数列表

这其实是两道非常基础和简单地题.但somehow每隔一段时间我老是会不经意地想起这两个问题,有时候卡克没有一下想起解法还会急的直冒汗................... 言归正传,贴出这两题代码 (1)打印斐波拉契数列 // Java program for Fibonacci number using Loop. public static int fibonacciLoop(int number){ if(number == 1 || number == 2){ return 1; } i

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

斐波那契数列:0.1.1.2.3.5.8.13………… 他的规律是,第一项是0,第二项是1,第三项开始(含第三项)等于前两项之和. > 递归实现 看到这个规则,第一个想起当然是递归算法去实现了,于是写了以下一段: public class RecursionForFibonacciSequence { public static void main(String[] args) { System.out.println(recursion(10)); } public static double

java输出斐波那契数列

题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) //Java编程:三种

Java 兔子问题(斐波那契数列)扩展篇

Java兔子问题(斐波那契数列)扩展篇 斐波那契数列指的是这样一个数列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...对于这个数列仅仅能说将兔子生产周期第为3月.假设生成周期变成4月这个数列肯定不是这种,或者说兔子还有死亡周期,在这里我是对兔子生产周期没有限定.仅仅要月份大于生产周期都能够计算出第month月份究竟能产生多少对兔子. Java兔子生殖问题 斐波那契数列又因数学家列昂纳多·斐波那契以兔子生殖为样例而引入.故又称为"兔子数列"

Java实现斐波那契数列Fibonacci

import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); System.out.println("斐波那契数列的个数是:"); int total=in.nextInt(); System.out.println("

PHP_I love U之(2)php衣食父母: Java与PHP效率比拼之一:斐波那契数列

PHP_I love U之(1)php衣食父母: Java与PHP效率比拼之一: 斐波那契数列 Fibonacci 解释见:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97 ( 应该是1 , 维基的公式错了!?!) (n≧2) 这次先写 Java的代码: class fb { static int f1b (int x) { if ((0==x)||(1==x) ) {  ret

Java - 斐波那契(递归、或不递归)

不递归 package com.ikoo; public class NoRecursion { public static void main(String[] args) { int front = 1; int center = 1; int after = 0; for (int i = 1; i <= 10; i++) { if (i == 1 || i == 2) { System.out.print(1 + " "); } else { after = front

JAVA基本算法面试题:1斐波纳契数列

开始学习JAVA,基础知识恶补! 斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*). 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 以下是Java代码实现(递归与递推两种方式): import java.util.Scanner;