(一)菲波那切数列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)(≥ 2,∈ 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实现相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java

    <LeetCode力扣练习>剑指 Offer 10- I. 斐波那契数列 Java 一.资源 题目: 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N) ...

  2. 兔子繁殖问题 斐波那契数列 java实现

    兔子繁殖问题 斐波那契数列 java实现 问题描述 一对兔子,从出生后第3个月起每个月都生一对兔子. 小兔子长到第3个月开始每个月又生一对兔子. 假如兔子都不死, 请问第1个月出生的一对兔子,第n个月 ...

  3. 斐波拉契数列 Java三种实现

    对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...

  4. 斐波拉契数列 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*) 也称黄金分割数列,兔子数列 通项 ...

  5. 斐波那契数java实现_斐波那契数列Java实现[剑指offer]

    描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题解 1.递归实现 采用递归的方式进行实现时,从第n个节点向下递归时,存 ...

  6. 最长斐波那契数列java实现

    class Solution {public int lenLongestFibSubseq(int[] arr) {//建立一个二维数组来存储每一个以i为结尾元素,j为倒数第二个元素的斐波那契数列的 ...

  7. 递推法:斐波那契数列java

    在不使用递归和公式法的情况下,求斐波那契数列,使用递推法,极大降低时间复杂度 public class Fei {public static void main(String[] args) {// ...

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

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

  9. 斐波那契数列 Java实现

    同样,该算法实现可分为递归实现和非递归实现. 以下为递归实现,从n开始往后退: /*** 计算第n个斐波那契数* @param n* @return*/private int fabonacciRec ...

  10. 算法-斐波那契数列 java

最新文章

  1. Spring源码分析【8】-MyBatis注解方法不能重载
  2. 金科院男生大学4年赚50万 毕业前又接500万订单
  3. typescript继承和重写
  4. 【Redis】三、Redis安装及简单示例
  5. ASP.NET企业开发框架IsLine FrameWork系列之十四--框架配置信息大全(中)
  6. OpenShift 4 Hands-on Lab (13) 使用持久化存储
  7. 软件设计师备考知识04
  8. python3.6.5安装步骤-Ubuntu16.04安装python3.6.5步骤详解
  9. Go本地浏览Web服务器
  10. 开源一个cmpp协议转http协议项目
  11. Tomcat的日志配置
  12. 网站调用百度地图展示位置,调用百度开放平台api 动态静态调用
  13. git 遇到The remote end hung up unexpectedly
  14. 一种基于敏感度可调的语音情感识别方法及系统
  15. 06-手机登录token生成容联云短信验证用户认证和网关整合(网关做统一权限认证)
  16. 【视频课】8大真实金融工程案例,20多小时Python进阶课推荐给你学习!
  17. 现在完成时与其他时态的区别
  18. 在VIM3开发板上运行无修改的iOS内核镜像
  19. 人际交往的产生与发展
  20. 虚拟机命令里面的光标不动了怎么办_专治VMware各种不服之虚拟机开机黑屏、蓝屏...

热门文章

  1. 【视频图片网站源码】苹果cmsV10x影视源码[自适应+20个广告位]
  2. 数据库敏感数据加密技术
  3. 30款免费3D建模软件,总有一款适合你!
  4. DSP程序结构优化技巧
  5. linux 手机遥控器,哪一个最适用?五款常用手机万能遥控器对比体验
  6. Iass、Pass、Sass三种云服务有什么区别?
  7. stm8s单片机2位数码管显示_STM8S103数字电压表头,增加四位显示,串口功能,附源码...
  8. 关于过程改进和能力提升
  9. 聪明人懂得深交四种人,绝交三种人!
  10. 74系列芯片功能说明