斐波那契数列想必大家都知道吧,如果不知道的话,我就再啰嗦一遍,

斐波那契数列为:1 2 3 5 8 13 ...,也就是除了第一项和第二项为1以外,对于第N项,有f(N)=f(N-1)+f(N-2)。

下面我用三种方法实现这个函数,分别是:递归,循环,矩阵。

递归方法:

public class Feibo {
//递归方法
public static int recFeiBo(int n) {
if(n<=0) {
return 0;
} if(n==1 || n==2) {
return 1;
} return recFeiBo(n-1) + recFeiBo(n-2);
} public static void main(String[] args) {
System.out.println(recFeiBo(6));
}
}

循环方法:

public class Feibo{
public static int recFeiBo(int n) {
if(n<=0) {
return 0;
} if(n==1 || n==2) {
return 1;
} int pre =1;
int temp =0;
int res =1; for(int i=1; i<=n-2; i++) {
temp = res;
res+=pre;
pre = temp;
} return res;
} public static void main(String[] args) {
System.out.println(recFeiBo(6));
}
}

矩阵的方法:

不知道你们有没有发现:

所以,最终求第N项数,就转化为求矩阵的n-2次方。

public class Feibo{
public static int recFeiBo(int n) {
if(n<=0) {
return 0;
}
if(n==1 || n==2) {
return 1;
} int[][] baseMatrix = {{1,1},{1,0}};
int[][] res = matrixPower(baseMatrix, n-2);
return res[0][0] + res[1][0];
} public static int[][] matrixPower(int[][] m, int n) {
int[][] temp = m;
int[][] res = new int[m.length][m[0].length]; for(int i=0; i<m.length; i++) {
res[i][i] = 1;
}
//n左移一位,并赋值给n
//下面的for循环是用来快速的求解矩阵的n次方的。可以参考我下一篇关于如何快求解高次方
for(;n!=0; n>>=1) {
//判断第0位是不是1
if((n&1)!=0) {
res = multiMtrix(res,temp);
}
temp= multiMtrix(temp, temp);
} return res;
} private static int[][] multiMtrix(int[][] m1, int[][] m2) {
int[][] res = new int[m1.length][m2[0].length];
for(int i=0; i<m1.length; i++) {
for(int j=0; j<m2[0].length; j++) {
for(int k=0; k<m2.length; k++) {
res[i][j] += m1[i][k]*m2[k][j];
}
}
}
return res;
} public static void main(String[] args) {
System.out.println(recFeiBo(6));
}
}

其实斐波那契额数列问题就是可以总结为一类问题,就是让你求的当前值可以用函数表示的,f(n)=f(n-1)+f(n-2),这类问题你都可以用矩阵的方式去实现,比如爬楼梯问题,有n阶楼梯,每次只能跨1阶或2阶,归结出来就是s(n)=s(n-1)+s(n-2),初始值s(1)=1,s(2)=2.

斐波那契数列—Java的更多相关文章

  1. 斐波那契数列-java编程:三种方法实现斐波那契数列

    题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...

  2. 斐波那契数列—java实现

    最近在面试的时候被问到了斐波那契数列,而且有不同的实现方式,就在这里记录一下. 定义 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

  3. 剑指offer【07】- 斐波那契数列(java)

    题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...

  4. 斐波那契数列-java实现

    1,1,2,3,5,8,13,21...... 以上的数列叫斐波那契数列,今天的面试第一题,输出前50个,这里记录下. 方式一 package com.geenk.demo.my; /** * @au ...

  5. 07.斐波那契数列 Java

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 思路 递归 若n<=2;返回n; 否则,返回Fibonacci ...

  6. 《剑指offer》面试题9 斐波那契数列 Java版

    书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...

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

    斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times ...

  8. 斐波那契数列(Java实现)

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...

  9. 斐波那契数列 Java 不同的实现方法所需要的时间比较

    # 首先我们直接看一个demo以及他的结果 public class QQ { public static void main(String[] args) throws ParseException ...

随机推荐

  1. 计算幂 51Nod 1046 A^B Mod C

    给出3个正整数A B C,求A^B Mod C.   例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整数A B C,中间用空格分隔.(1 <= A,B,C <= 10^ ...

  2. 回味Python2.7——笔记1

    一.基本知识 1.一个值可以同时赋给几个变量: >>> x = y = z = 0 # Zero x, y and z >>> x 0 >>> y ...

  3. 搭建私有Docker Registry

    Docker官方提供了用于搭建私有registry的镜像,并配有详细文档. 官方Registry镜像:https://hub.docker.com/_/registry 官方文档:https://do ...

  4. eclipse 打包 jar 到 Linux上运行

    1.选择需要打包的项目,右键 Export 2.选择Runnable JAR file,然后点击 Next 3.选择jar包运行的main类,以及定义jar包的名字,保存的地方 4.将 导出来的 ja ...

  5. 阿里云有对手了!CDN横评:腾讯云优势明显

    如今,云计算产品越来越多,像国内的BAT三大巨头都提供了云主机(腾讯云CVM.阿里云ECS.百度云BCC),另外还有存储.数据库.安全等相关云服务.在这其中,CDN也是一项重要的云服务,CDN指的是内 ...

  6. iOS与web交互的那些事

    一转眼又是大半年过去了,除了上架了一款新应用外,也没什么进步.所以最近琢磨着搞点事情,不然我那本Java教程都快看完了. 做为一名iOS高(la)阶(ji)法师,几乎所有的任务里,都会出现web这个从 ...

  7. ASP.NET MVC 开发微信支付H5(外置浏览器支付)

    H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付. 主要用于触屏版的手机浏览器请求微信支付的场景.可以方便的从外部浏览器 ...

  8. Redux源码分析之bindActionCreators

    Redux源码分析之基本概念 Redux源码分析之createStore Redux源码分析之bindActionCreators Redux源码分析之combineReducers Redux源码分 ...

  9. 【万能的搜索,用广搜来解决DP问题】ZZNU -2046 : 生化危机 / HDU 1260:Tickets

    2046 : 生化危机 时间限制:1 Sec内存限制:128 MiB提交:19答案正确:8 题目描述 当致命的T病毒从Umbrella Corporation 逃出的时候,地球上大部分的人都死去了. ...

  10. 微信小程序movable-view移动图片和双指缩放

    先从movable-view开始说起吧. movable-view是小程序自定义的组件.其描述为:"可移动的视图容器,在页面中可以拖拽滑动". 官方文档地址:https://mp. ...