首页 > 代码库 > 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
古典问题:有一对兔子,从出生后第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)); } }
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。