古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?...

这是斐波那契数列,规律是:从第三个数开始,每个数都是前两个数的合.

是的,最简单的方法就是递归,

package com.mh.basic.one;

public class Recursion {

    
    public static int f(int i){
        if( i == 1  || i == 2 ){
            return 1;
        }
        
        else{
            return f(i-1) + f(i-2);
        }
    }
    
    public static void main(String[] args) {
        
        System.out.println(Recursion.f(20));
    }
    
    
    
}

这种是面向过程式的编程,java是一种面向对象的语言,我们能不能使用面向对象的思想解决这个问题呢?答案是肯定的

package com.mh.basic.one;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//创建一个兔子类
public class Rabbit {

    private int age ;//有一个属性age,用来记录年龄(按月计算)
    
    private static List<Rabbit> list = new ArrayList<Rabbit>(Arrays.asList(new Rabbit(1)));//定义一个"兔子窝",兔子窝中本来就有一对兔子
    
    public Rabbit(int age){//构造方法
        this.age = age;
    } 
    
    public static Rabbit birth(){//兔子有生小兔子的行为
        return new Rabbit(1);
    }
    

    public static int getSize(List<Rabbit> list){//获得兔子窝中的兔子总量
        return list.size();
    }
    
    
    public static int countRabbits(int month){//计算给定月份兔子窝中应有多少兔子
        
        if( month == 1 || month == 2) {
            
            return 1;
            
        }else{
                list.get(0).age = 3;
            }
            
        
        Rabbit curr_Rabbit = null;
        
        for(int i = 3 ; i <= month ; i++){//从三月份开始
            
            for(int j = 0; j < list.size(); j++){
                
                curr_Rabbit = list.get(j);
                
                if(curr_Rabbit.age >= 3){//如果年龄大于等于三个月,可以生兔子
                    
                    list.add(birth());
                }
                
                curr_Rabbit.age++;//不然年龄加1
            }
        }
        return getSize(list);
    }

    
    public static void main(String[] args) {
        System.out.println(Rabbit.countRabbits(20));
    }
}

 

转载于:https://www.cnblogs.com/hui-8-ma/p/6719608.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目:古典问题:有一对兔子,从出生后第3个每个一对兔子小兔子长到第三个每个一对兔子,假如兔子都不每个兔子对数为多少? 这是一个著名的数学题目——斐波那契数列。每个兔子对数可以按照斐波那契数列进行计算,即每个兔子对数等于前两个兔子对数之和。如果假设第一个月一对兔子,则第二个也为一对兔子第三个为两对兔子第四为三对兔子,以此类推。 ### 回答2: 这个问题的答案其实是一个经典的数列问题,被称为“斐波那契数列”,因为这个数列的发现者Fibonacci被誉为欧洲中世纪最伟大的数学家之一。 解决这个问题需要用到递归和数列知识。假设第n个有 f(n) 对兔子,那么根据题意,每个兔子对数会按照斐波那契数列增加,公式为: f(n) = f(n-1) + f(n-2) 初始条件为 f(1)=1,f(2)=1。因为第一个月只有一对兔子,第二个也只有一对,从第三个开始才会有繁殖。 那么我们就可以用这个公式递归地求出每个兔子对数了: 第一个月有1对兔子; 第二个有1对兔子第三个有 f(3) = f(2) + f(1) = 2 对兔子第四有 f(4) = f(3) + f(2) = 3 对兔子; 第五个有 f(5) = f(4) + f(3) = 5 对兔子; 第六个有 f(6) = f(5) + f(4) = 8 对兔子; 以此类推,我们可以求出每个兔子对数。 需要注意的是,这个递归公式只有在兔子的情况下才成立。如果加入了兔子亡的情况,就需要考虑新兔子数量和老年兔子数量的比例了,问题就更加复杂了。 ### 回答3: 这一问题被称为“兔子问题”,是一道经典的数学问题。我们可以通过找规律的方式来求解。 首先,我们假设第一个月一对兔子(也就是出生的那对兔子)。在第二个,这对兔子还没有育,因此仍旧只有一对。但是,从第三个开始,我们就会得到新一对兔子,那么兔子的对数就变成了两对(之前的那一对加上新一对)。 到了第四,这两对兔子中的第一对已经长大,也需要开始育,因此又可以得到新一对兔子。同时,第二对兔子也会育新兔子。这个时候,兔子的对数就变成了三对。 我们可以发现,每当有一对兔子长到第三个,就会产下一对兔子。因为每对兔子都需要三个的时间才可以育。因此,我们可以得出一个公式:每个兔子对数等于上个兔子对数加上新兔子对数。 通过这个公式,我们可以列出每个兔子对数如下: 第1个:1对 第2个:1对 第3个:2对(1+1) 第4个:3对(1+2) 第5个:5对(2+3) 第6个:8对(3+5) 第7个:13对(5+8) 第8个:21对(8+13) 以此类推。 因此,我们可以得出结论:每个兔子对数等于斐波那契数列中对应位置的数值。斐波那契数列是一个序列,其中每个数都是前两个数的和。也就是说,第n个数等于第n-1个数和第n-2个数的和。前几个斐波那契数列的数值为:1、1、2、3、5、8、13、21...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值