数据结构之斐波那契数列java实现
(一)菲波那切数列java实现
(1)递归(Recursion)实现代码:输入47,口秒32出结果
import java.util.Scanner;
public class FbnqRecursion {
static Scanner sc = new Scanner(System.in);// 定义全局console输入接口
public static void main(String[] args) {// 主函数
// TODO Auto-generated method stub
while (true) {// 提供持续的计算能力
int xs = input();
System.out.println("要求的项位值:" + countnn(xs));
}
}
public static int input() {// 递归处理输入错误
int i = 0;
System.out.print("请输入要求的项位:");
// 处理非自然数及特殊字符输入
try {
i = sc.nextInt();
} catch (Exception e) {
System.out.println("您的输入非法,请重新输入!");
sc = new Scanner(System.in);//此处若不重置对象,会导致异常
return input();
}
//处理自然数输入
if (i < 1) {// 自然数从0开始,项位数从1开始
System.out.println("项位数为从1开始的自然数,您的输入非法,请重新输入!");
return input();
} else if (i >= 1 && i < 48) {
return i - 1;
} else {
System.out.println("因java语言中对整型数据的特性(最大整数可表达为2147483647),最多可计算第47项,您的输入已经越界,请重新输入!");
return input();
}
}
public static int countnn(int n) {// 递归计算数列项
if (n == 0) {// 递归出口1
return 0;
} else if (n == 1) {// 递归出口2
return 1;
} else {
return countnn(n - 2) + countnn(n - 1);
}
}
}
(2)循环(For)实现代码:输入47,口秒1出结果
import java.util.Scanner;
public class FbnqFor {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
while(true) {
//处理输入异常
int intMax=input();
//计算具体的数列项的值
compute(intMax);
}
}
public static int input() {
// TODO Auto-generated method stub
int temp=0;
System.out.print("请输入要求的项位数:");
//处理非自然数及特殊字符输入
try {
temp=sc.nextInt();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("您的输入非法,请重新输入:");
sc=new Scanner(System.in);
return input();
}
//处理自然数输入范围
if(temp<1) {
System.out.println("项位数为从1开始的自然数,您的输入非法,请重新输入!");
return input();
}else if(temp>=1&&temp<48) {
return temp;
}else {
System.out.println("因java语言中对整型数据的特性(最大整数可表达为2147483647),最多可计算第47项,您的输入已经越界,请重新输入!");
return input();
}
}
public static void compute(int intMax) {
int temp = 0;
if(intMax==1) {
temp=0;
}else if(intMax==2) {
temp=1;
}else {
int a = 0, b = 1;
for (int i = 3; i <= intMax; i++) {
temp = a + b;
a = b;
b = temp;
}
}
System.out.println(temp);
}
}
结论:递归真的高效吗?
(二)相关知识扩展
- 斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、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*)。
- 自然数:自然数概念指用以计量事物的件数或表示事物件数的数 。 即用数码0,1,2,3,4,……所表示的数 。自然数由0开始 , 一个接一个,组成一个无穷集体。而自然数只是不小于0的整数(也就是0和正整数),所以自然数有无数个,通常用n表示。
- java数据类型:
在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型。一个字节等于8个bit,java是跟平台无关的。
①整型:
其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样 byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1) ;short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1); int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1); long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)。可以看到byte和short的取值范围比较小,而long的取值范围太大,占用的空间多,基本上int可以满足我们的日常的计算了,而且int也是使用的最多的整型类型了。
在通常情况下,如果JAVA中出现了一个整数数字比如35,那么这个数字就是int型的,如果我们希望它是byte型的,可以在数据后加上大写的 B:35B,表示它是byte型的。
同样的35S表示short型,35L表示long型的,表示int我们可以什么都不用加,但是如果要表示long型的,就一定要在数据后面加“L”。
②浮点型:
float和double是表示浮点型的数据类型,他们之间的区别在于他们的精确度不同 float 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节
double 1.797693e+308~ 4.9000000e-324 占用8个字节
double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的,可以在数据后面加上“F”。
浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。
③boolean型(布尔型):
这个类型只有两个值,true和false(真和非真)
boolean t = true;
boolean f = false;
④char型(文本型) :
用于存放字符的数据类型,占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容
字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加' ',比如 '1'表示字符'1'而不是数值1,
char c = ' 1 ';
我们试着输出c看看,System.out.println(c);结果就是1,而如果我们这样输出呢System.out.println(c+0);
结果却变成了49。
⑤基本类型之间的转换
将一种类型的值赋值给另一种类型是很常见的。在Java中,boolean 类型与其他7中类型的数据都不能进行转换,这一点很明确。但对于其他7种数据类型,它们之间都可以进行转换,只是可能会存在精度损失或其他一些变化。
转换分为自动转换和强制转换:
自动转换(隐式):无需任何操作。
强制转换(显式):需使用转换操作符(type)。
将6种数据类型按下面顺序排列一下:
double > float > long > int > short > byte
如果从小转换到大,那么可以直接转换,而从大到小,或char 和其他6种数据类型转换,则必须使用强制转换。
(三)总结
递归概念:递归就是有去(递去)有回(归来)
三步走:
①主函数中引用输入项处理以及具体的数列项处理;
②递归处理输入项异常:大范围(输入特殊字符)、小范围(确定界限区间)
③递归处理数列项计算:终止条件设立、数列公式替换(F替换为函数名)
数据结构之斐波那契数列java实现相关推荐
- 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java
<LeetCode力扣练习>剑指 Offer 10- I. 斐波那契数列 Java 一.资源 题目: 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N) ...
- 兔子繁殖问题 斐波那契数列 java实现
兔子繁殖问题 斐波那契数列 java实现 问题描述 一对兔子,从出生后第3个月起每个月都生一对兔子. 小兔子长到第3个月开始每个月又生一对兔子. 假如兔子都不死, 请问第1个月出生的一对兔子,第n个月 ...
- 斐波拉契数列 Java三种实现
对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...
- 斐波拉契数列 java实现
指的是这样一个数列: 1 1 2 3 5 8 13 21 34 ... F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 也称黄金分割数列,兔子数列 通项 ...
- 斐波那契数java实现_斐波那契数列Java实现[剑指offer]
描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题解 1.递归实现 采用递归的方式进行实现时,从第n个节点向下递归时,存 ...
- 最长斐波那契数列java实现
class Solution {public int lenLongestFibSubseq(int[] arr) {//建立一个二维数组来存储每一个以i为结尾元素,j为倒数第二个元素的斐波那契数列的 ...
- 递推法:斐波那契数列java
在不使用递归和公式法的情况下,求斐波那契数列,使用递推法,极大降低时间复杂度 public class Fei {public static void main(String[] args) {// ...
- java斐波那契优化_用HashMap优化斐波那契数列 java算法
斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times ...
- 斐波那契数列 Java实现
同样,该算法实现可分为递归实现和非递归实现. 以下为递归实现,从n开始往后退: /*** 计算第n个斐波那契数* @param n* @return*/private int fabonacciRec ...
- 算法-斐波那契数列 java
最新文章
- Spring源码分析【8】-MyBatis注解方法不能重载
- 金科院男生大学4年赚50万 毕业前又接500万订单
- typescript继承和重写
- 【Redis】三、Redis安装及简单示例
- ASP.NET企业开发框架IsLine FrameWork系列之十四--框架配置信息大全(中)
- OpenShift 4 Hands-on Lab (13) 使用持久化存储
- 软件设计师备考知识04
- python3.6.5安装步骤-Ubuntu16.04安装python3.6.5步骤详解
- Go本地浏览Web服务器
- 开源一个cmpp协议转http协议项目
- Tomcat的日志配置
- 网站调用百度地图展示位置,调用百度开放平台api 动态静态调用
- git 遇到The remote end hung up unexpectedly
- 一种基于敏感度可调的语音情感识别方法及系统
- 06-手机登录token生成容联云短信验证用户认证和网关整合(网关做统一权限认证)
- 【视频课】8大真实金融工程案例,20多小时Python进阶课推荐给你学习!
- 现在完成时与其他时态的区别
- 在VIM3开发板上运行无修改的iOS内核镜像
- 人际交往的产生与发展
- 虚拟机命令里面的光标不动了怎么办_专治VMware各种不服之虚拟机开机黑屏、蓝屏...