斐波那契数列(不死神兔问题) Java代码三种方法实现

标题:斐波那契数列(不死神兔问题) Java代码三种方法实现

斐波那契数列又称 黄金分割 数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“ 兔子数列 ”:

  • 指的是这样一个数列:1、1、2、3、5、8、13、21、34、……以此类推
  • 其规律是从第3个数开始,每个数都等于它前两个数的和。

Java代码实现如下:

方法一

编写递归算法程序:一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求数列的第40位数是多少。

/*编写递归算法程序:不死神兔 数的规则如下: 1、1、2、3、5、8、13、21、34...... 求数列的第40位数是多少。*/
public class TestRabbit01 {
    //封装方法:递归计算方法  自己调用自己
    //下面为方法,public static是成员方法修饰符 int是返回值类型是整数型变量 result是方法名 形参是n
    public static int result(int n) {
        if (n <= 0) {//当n不大于0时候 返回0  要求必须是大于0的月份
            return 0;
        } else if (n == 1 || n == 2) {//当月份是1和2时候都返回1
            return 1;
        } else {
            return result(n - 1) + result(n - 2);//从第三个月开始,它的值等于它前面两个值相加的结果
        }
    }
    //main方法测试
    public static void main(String[] args) {
        System.out.println(result(40));//打印结果102334155
    }
  }

方法二:循环方法实现

public class TestRabbit01 {
    //封装方法:   
    //方法二 使用临时变量加for循环办法
    public static void res(int n){
        int a = 1;//存放前两个数的值
        int b = 1;
        int c = 0;//定义临时变量c
        if(n<= 0){
            System.out.println("请输入正整数月份...");
        }else if(n == 1 || n == 2){
            System.out.println("第"+n+"个月份的兔子数量是1个");
        }else{
            for (int i = 1; i <= n-2; i++) {
                c = a + b;//从第三个数开始,是前两个数的和
                a = b;//更新第一个数的值
                b = c;//更新第二个数的值
            }
            System.out.println("第"+n+"个月份的兔子数量是"+c+"个");
        }
    }
   
    //main方法测试
    public static void main(String[] args) {
        res(40);
    }
}

方法三 数组+循环方法实现

public class TestRabbit01 {
    //封装方法:
    //方法三 使用数组加for循环
    public static void  res3(int n){
        int[] arr = new int[n];//声明数组长度
        arr[0] = arr[1] = 1;//动态初始化
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i-1]+arr[i-2];
        }
        System.out.println("第"+n+"个月份的兔子数量是"+arr[n-1]+"个");
    }

    //main方法测试
    public static void main(String[] args) {
        res3(3);//2
        res3(40);//打印结果102334155
    }
}

这道不死神兔题的实质就是斐波那契数列: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
现在从递归.临时变量.普通数组三个角度出发思考逻辑,当然还有其它的方法(比如动态数组ArrayList…),同一道题用各种不同的思路去思考解决,也是对知识综合运用的锻炼吧。
希望对大家有帮助,也欢迎大家多多交流,谢谢

你可能感兴趣的:(JAVA练习题,java,算法,数据结构)