斐波那契数列—Java
斐波那契数列想必大家都知道吧,如果不知道的话,我就再啰嗦一遍,
斐波那契数列为: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的更多相关文章
- 斐波那契数列-java编程:三种方法实现斐波那契数列
题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...
- 斐波那契数列—java实现
最近在面试的时候被问到了斐波那契数列,而且有不同的实现方式,就在这里记录一下. 定义 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
- 剑指offer【07】- 斐波那契数列(java)
题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...
- 斐波那契数列-java实现
1,1,2,3,5,8,13,21...... 以上的数列叫斐波那契数列,今天的面试第一题,输出前50个,这里记录下. 方式一 package com.geenk.demo.my; /** * @au ...
- 07.斐波那契数列 Java
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 思路 递归 若n<=2;返回n; 否则,返回Fibonacci ...
- 《剑指offer》面试题9 斐波那契数列 Java版
书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...
- 用HashMap优化斐波那契数列 java算法
斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times ...
- 斐波那契数列(Java实现)
描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...
- 斐波那契数列 Java 不同的实现方法所需要的时间比较
# 首先我们直接看一个demo以及他的结果 public class QQ { public static void main(String[] args) throws ParseException ...
随机推荐
- ASP.NET MVC5 怒跨 Linux 平台
安装CentOS 安装Mono #安装yum工具包 yum -y install yum-utils #通过rpm添加Mono源 rpm --import "http://keyserver ...
- Git:常用功能 - 命令行
1. 正在某个分支进行开发,突然有个紧急BUG需要切换到其他分支进行修复? git add README.md # 将文件添加到暂存区 git stash save "v1.0.0 in d ...
- 管理 Machine - 每天5分钟玩转 Docker 容器技术(47)
用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...
- 自动创建win计划任务
@echo off set NAME=refrash IE set TIME=20:01:00 set DAY=MON,TUE,WED,THU,FRI,SAT,SUN set COMMAND=cscr ...
- Web聊天应用中的表情插件
聊天应用中的表情插件 用于即时聊天应用的图片表情插件,具有展示表情.插入表情和表情编解码的功能 项目地址 看代码 看demo 原理介绍 web端的即时聊天中看到的表情,其实就是一张张表情图片,通过im ...
- 亚马逊AWS EC2云实例AMI安装LNMP环境(3)——Mysql5.5
概括:这里选择亚马逊EC2的Linux AMI实例,该Linux服务器是亚马逊预配置的Linux环境,内置多个YUM源,属于亚马逊首推的稳定Linux服务器.默认登录用户名为ec2-user,执行ro ...
- 解决删除元素动画的bug
效果说明 首先说明一下我需要做到的效果 其实很简单---点击删除按钮的时候,加入删除动画 删除动画是这样的,高度和宽度都会均匀的变小,内部的元素需要被隐藏(因为会有文字挤在一起):直到变为0结束,时长 ...
- 表达式求值(二叉树方法/C++语言描述)(四)
代码清单 // binarytree.h #ifndef BINARYTREE_H #define BINARYTREE_H template <typename T> class Bin ...
- amd和cmd区别
作者:玉伯 链接:https://www.zhihu.com/question/20351507/answer/14859415 来源:知乎 著作权归作者所有,转载请联系作者获得授权. AMD 是 R ...
- js 重载(overload)
1.js中不支持重载的语法.(因为js不允许多个同名函数存在) 解决:使用arguments类数组对象接收调用时所有传入的参数值. 2. arguments可以使用length属性,通过下标访问,不能 ...