Java经典例题50题 ----1 、Java利用斐波那契数列求:兔繁殖数目问题

这篇博客介绍了如何使用Java通过斐波那契数列解决兔繁殖数目问题,适合初学者练习。作者分享了自己的学习心得,并承诺会整理成文件供读者下载。文章提供了详细源码和联系方式。

[Java利用斐波那契数列求:兔繁殖数目问题]

学了Java的基础部分,想找点题目练练手。有兴趣的朋友可以一起哟!(等做完后也会整理成文件,免费给大家下载的)由于本人也在学习的路上,所以仅供参考。

话不多说,今天先附上我的第一个题(题目在源码部分,源码注释已经足够详细,如实在有不明白的,可联系我:qq:2530318393,或者留言,另外:写作不易,转载请声明所属~~~~~~~~):

/**
 * @program: rabbitNum
 * @description: 程序入口
 * @author: Mr.XiaoShi
 * @create: 2020-08-27 16:30
 **/

/**
 * 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三
 * 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
 * 这是一个菲波拉契数列问题
 * 波拉契数列的一些规律:
 *      1、这个数列从第三项开始,每一项都等于前两项之和
 *      2、从第二项开始,每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少(注:奇数项和偶数项是指项数的奇偶)
 *      3、斐波那契数列(f(n),f(0)=0,f(1)=1,f(2)=1,f(3)=2……)的其他性质:
 *          1.f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1
 *          2.f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)
 *          3.f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1
 *          4.[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)
 *          5.f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1
 *          6.f(m+n-1)=f(m-1)·f(n-1)+f(m)·f(n) 7.[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)
 *          8.f(2n-1)=[f(n)]^2-[f(n-2)]^2
 *          9.3f(n)=f(n+2)+f(n-2)
 *          10.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1])
 **/

import java.util.Scanner;

/**
 * 月份:1-2   3       4         5           6
 * 孕兔:0     2(1对) 2 (1对)  4(2对)      6(3对)
 * 数量:2     2+2     4+2       6+2+2       10+6
 * */
public class Program {
    public static void main(String[] args) {
        System.out.println("题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三\n" +
                " 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?\n" +
                " (这是一个菲波拉契数列问题)");   //打印题目

        System.out.print("请输入你想知道的时间(即到第?个月):");
        int Mounths = new Scanner(System.in).nextInt();   //new一个Scanner对象来接收用户的输入

        int fn_1 = 1;    //代表前一个月的兔子对数
        int fn_2 = 1;    //代表前两个月兔子的对数(注意这里是对数,题目要求的是个数,在输出的时候*2就行了)
        int fn;
        System.out.println("第1个月:"+ (fn_1*2) +"只\n第2个月:"+ (fn_2*2) +"只");  //先输出前两个月的兔子数目

        /*利用循环来输出剩下的月份数的兔子个数,循环次数就是用户输入的Mounths变量*/
        for (int i = 2; i < Mounths; i++) {
            fn = fn_1 + fn_2;    //先计算本月份的,等于前俩个个月之和
            fn_2 = fn_1;         //这里:一定要先赋值前第二个月的,再赋值前第一个月的,顺序不能错
            fn_1 = fn;
            System.out.println("第"+ (i+1) +"个月:"+ (fn*2) +"只");   //最后打印输出

        }
        /**还有数组的方法,数组也类似的,也可以定长,也可以用户输入长度,
         * 然后再根据前两个的值之和等于第三个这样的规律来完成数组的赋值**/

        /**另外自己也根据题目写了递归的做法下**/
        /*System.out.print("您想知道那个月的兔子数量?请输入:"+feiBoLaQi_num(new Scanner(System.in).nextInt())*2+"只");
         * 上面这种写法的输入提示不会先输出,而是在你输入数据之后输出,是因为后面的是静态代码块,编译的时候就已经存在了,所以必须分开写
         * 才能看到效果,而因为main是静态的,不能在其中调用外部的非静态变量或者方法,所以feiBoLaQi_num()在这里必须是静态的,或者
         * 另外为它写一个类,通过new一个类来完成调用。
         * */
        System.out.print("您想知道那个月的兔子数量?请输入:");
        System.out.print(feiBoLaQi_num(new Scanner(System.in).nextInt())*2+"只");

    }
    /**
     *@Description: 递归函数,功能求第n个菲波拉契数列的值,第一第二个值为1
     *@Param:
     *@return: int
     *@Author: your name
     *@date: 2020/8/27 0027
     **/
    static int feiBoLaQi_num(int n)
    {
        return n>2? feiBoLaQi_num(n-1)+feiBoLaQi_num(n-2) : 1;  //这里运用三元运算符来完成判断选择
    }
}

运行结果:在这里插入图片描述

下一篇:求101~200之间的素数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值