题目:
1、每头牛6牛的时候开始生小牛,并且生得牛都是母牛;
2、农场来了一头6岁的牛(第一年就生下一头小牛);
问:
20年后,农场有多少头牛;
解题思路1:
我拿到这个问题的第一反应就是使用对象,建立一个Cow类,然后有一个age属性,再用一个全局变量cows来记录牛的数量,每当我们实例化一个牛cows就会+1。
1 class Cow { 2 int age; //牛的年龄 3 static int cows = 0; //全局变量,用来记录实例化的次数 4 5 { 6 this.cows++; //构造代码块,在对象初始化的时候就会增加cows 7 } 8 9 Cow(int age) { //初始化方法 10 this.age = age; 11 } 12 13 void growUp() { //没过一年牛就会长一岁 14 this.age++; 15 } 16 }
接下来是main方法,只需要设置一个年数的for循环,再判断牛的年龄是否大于或等于6,大的话就实例化一个新的对象,最后输出结果:
1 public class WoCow { 2 public static void main(String[] args) { 3 Cow cow[] = new Cow[300]; 4 int cows = 0; 5 cow[0] = new Cow(6); 6 7 for (int year = 1; year <= 20; year++) { 8 cows = Cow.cows; 9 System.out.println("今年是第:" + year + "年"); 10 for (int i = 0; i < cows; i++) { 11 cow[i].growUp(); 12 if (cow[i].age >= 6) { 13 cow[Cow.cows] = new Cow(0); 14 } 15 } 16 System.out.println("有" + Cow.cows + "只牛"); 17 } 18 } 19 }
运行结果:
1 今年是第:1年 2 有2只牛 3 今年是第:2年 4 有3只牛 5 今年是第:3年 6 有4只牛 7 今年是第:4年 8 有5只牛 9 今年是第:5年 10 有6只牛 11 今年是第:6年 12 有7只牛 13 今年是第:7年 14 有9只牛 15 今年是第:8年 16 有12只牛 17 今年是第:9年 18 有16只牛 19 今年是第:10年 20 有21只牛 21 今年是第:11年 22 有27只牛 23 今年是第:12年 24 有34只牛 25 今年是第:13年 26 有43只牛 27 今年是第:14年 28 有55只牛 29 今年是第:15年 30 有71只牛 31 今年是第:16年 32 有92只牛 33 今年是第:17年 34 有119只牛 35 今年是第:18年 36 有153只牛 37 今年是第:19年 38 有196只牛 39 今年是第:20年 40 有251只牛
以上是使用对象的方法,下面我们来探索其中的规律:
年数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
新增牛的数量 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
我们从0年开始,因为已经有一只6岁的母牛了。第一年它生下了一只,因为它已经是大于6岁了,一直到前六6年每年只增加1只,因为其他的牛都是小于6岁的。但是到了第七年就发生的变化,在第1年生下的牛到了第7年刚好6岁,先在能生育的牛多了一只,以此类推:
年数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
新增牛的数量 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
到了第13年的时候又发生了变化,因为在第7点出生的两头牛已经6岁了 :
年数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
新增牛的数量 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 12 | 16 | 21 | 27 | 34 | 43 | 55 |
由此不难发现其中的规律:如果年数大于6年的话,那么第N年增加牛的数量就是(N-5)年前所有增加牛的数量的和:
举例:
第7年增加牛的数量是:第0年的数量+第1年的数量
第8年增加牛的数量是:第0年 到 第2年的数量和
第13年增加牛的数量: 第0年到 第7年的数量和
……………………
根据这个规律,我们开始写代码:
1 int getCows(int year) { 2 3 int sum = 0; 4 if (year < 7) { 5 return 1; 6 } 7 for (int i = 0; i < year - 5; i++) { 8 sum += getCows(i); //递归方法 9 } 10 return sum; 11 }
我们定义了一个getCows()方法,这个方法的返回值就会告诉我们,当年会增加多少头牛,下面我们写main方法:
1 public static void main(String[] args) { 2 int sum = 0; 3 ArrayCow cow = new ArrayCow(); 4 5 for (int i = 0; i < 21; i++) { 6 sum += cow.getCows(i); 7 } 8 System.out.println(sum); 9 }
运行结果:
1 251
原文:http://www.cnblogs.com/srun/p/3650382.html