算算有多少头牛(NumberOfCaws)-构造法之递推(JAVA实现)
2006-05-02 19:30
295 查看
有一农夫养一头母牛,母牛三年后可以繁殖,每年产一头母牛,问20年后一共可以有多少头母牛?
我们现在知道初始情况,就是一头母牛。根据母牛三年后可以繁殖,且每年产一头小母牛,我们可以把20年中的某一年母牛数F(n)分为两个部分:前一年的O(n)和当年新出生的N(n)。而我们可以进一步推出O(n)=F(n-1),即前一年的牛的总数和当年的非新生牛数目相同,那么可以出公式:F(n)=F(n-1)+N(n)。
从公式中我们可以看出,只要把N(n)与F()建立关系就可以形成一个递推公式,我们知道当年出生的牛是三年前的牛所生(三年以内的牛是没有繁殖能力的),且每头牛只生一头小母牛,所以N(n)=F(n-3),即当年新生的牛和三年前的牛总数相等。
我们现在就完成了一个递推公式:F(n)=F(n-1)+F(n-3)
并且题目中给了我们初始条件:F(1)=1
根据这个公式,我们可以利用递归进行相应的编程。
其实这个问题和Fibonacci数列的发现有着千丝万缕的联系:
Fibonacci数列是由意大利著名数学家Fibonacci于1202年提出的“兔子繁殖问题”归纳出来的,该问题又称“Fibonacci问题”:有一对雌雄兔子,假定过两个月便可以繁殖雌雄各一的一对小兔子。问过n个月共有多少对兔子?
我们把同一时期的兔子分为俩部分,一是前n-1个月繁殖的兔子O(n),另一是当月繁殖的兔子N(n),总共的兔子数用F(n)表示,即得:F(n)=O(n)+N(n)。
由于O(n)=F(n-1),所以原式可以化为F(n)=F(n-1)+N(n)。同样由于兔子两个月后又繁殖能力且也是恰巧的计划生育(只生一对),所以N(n)=F(n-2)。
最后我们得出了和这道题巧合般相似的递推公式:F(n)=F(n-1)+F(n-2)
最后附上JAVA源代码:
/*
* NumberOfCaws.java
* Created on 2006年4月21日, 下午7:54
*/
/**
* @author Richard
*/
public class NumberOfCaws {
protected int value;
public NumberOfCaws(int years) {
value = years;
}
protected int calNumberOfCaws(int years){
if(years<=3)
return 1;
else
return calNumberOfCaws(years-1)+calNumberOfCaws(years-3);
}
public int getNumberOfCaws(){
return calNumberOfCaws(value);
}
}
/*
* NumberOfCawsTest.java
* Created on 2006年4月21日, 下午7:53
*/
/**
* @author Ricahrd
*/
public class NumberOfCawsTest {
public static void main(String[] args) {
NumberOfCaws testFarm = new NumberOfCaws(20);
System.out.println("Total number of caws :" +testFarm.getNumberOfCaws());
}
}
我们现在知道初始情况,就是一头母牛。根据母牛三年后可以繁殖,且每年产一头小母牛,我们可以把20年中的某一年母牛数F(n)分为两个部分:前一年的O(n)和当年新出生的N(n)。而我们可以进一步推出O(n)=F(n-1),即前一年的牛的总数和当年的非新生牛数目相同,那么可以出公式:F(n)=F(n-1)+N(n)。
从公式中我们可以看出,只要把N(n)与F()建立关系就可以形成一个递推公式,我们知道当年出生的牛是三年前的牛所生(三年以内的牛是没有繁殖能力的),且每头牛只生一头小母牛,所以N(n)=F(n-3),即当年新生的牛和三年前的牛总数相等。
我们现在就完成了一个递推公式:F(n)=F(n-1)+F(n-3)
并且题目中给了我们初始条件:F(1)=1
根据这个公式,我们可以利用递归进行相应的编程。
其实这个问题和Fibonacci数列的发现有着千丝万缕的联系:
Fibonacci数列是由意大利著名数学家Fibonacci于1202年提出的“兔子繁殖问题”归纳出来的,该问题又称“Fibonacci问题”:有一对雌雄兔子,假定过两个月便可以繁殖雌雄各一的一对小兔子。问过n个月共有多少对兔子?
我们把同一时期的兔子分为俩部分,一是前n-1个月繁殖的兔子O(n),另一是当月繁殖的兔子N(n),总共的兔子数用F(n)表示,即得:F(n)=O(n)+N(n)。
由于O(n)=F(n-1),所以原式可以化为F(n)=F(n-1)+N(n)。同样由于兔子两个月后又繁殖能力且也是恰巧的计划生育(只生一对),所以N(n)=F(n-2)。
最后我们得出了和这道题巧合般相似的递推公式:F(n)=F(n-1)+F(n-2)
最后附上JAVA源代码:
/*
* NumberOfCaws.java
* Created on 2006年4月21日, 下午7:54
*/
/**
* @author Richard
*/
public class NumberOfCaws {
protected int value;
public NumberOfCaws(int years) {
value = years;
}
protected int calNumberOfCaws(int years){
if(years<=3)
return 1;
else
return calNumberOfCaws(years-1)+calNumberOfCaws(years-3);
}
public int getNumberOfCaws(){
return calNumberOfCaws(value);
}
}
/*
* NumberOfCawsTest.java
* Created on 2006年4月21日, 下午7:53
*/
/**
* @author Ricahrd
*/
public class NumberOfCawsTest {
public static void main(String[] args) {
NumberOfCaws testFarm = new NumberOfCaws(20);
System.out.println("Total number of caws :" +testFarm.getNumberOfCaws());
}
}
相关文章推荐
- java实现计算两个日期相差多少月、比较两个日期大小 等常用日期操作
- java实现一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 用java实现:判断1-100之间有多少个素数,并输出所有素数
- java实现华为之老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
- java语言编程实现两个时间相差多少天、多少小时、多少分、多少秒
- java实现一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 农场一头小母牛,每年生头小母牛,母牛5岁产母牛,20年上多少牛?--java面向对象方式实现
- java实现一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- Java实现给定任意年份和月份,输出该月有多少天
- 判断101-200之间有多少个素数,并输出所有素数 Java实现
- java实现我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
- java实现3个线程轮流打印A、B、C,达到“ABBCCCAAAABBBBBCCCCCC”,打印200个字符停止,并在控制台打印出A、B、C各打印了多少个
- java实现求一个数组中有多少个子序列
- 100匹马100袋粮食大马驮三袋小马驮两袋,两个小马崽驮一袋,问大马小马小马崽各多少匹? java代码如何实现?
- java里如何实现两个等长度的字符串数组有多少个元素相同(从最左边开始,一旦遇到不同元素则跳出计数)
- [java面试]逻辑推理6 10 18 32 下一个数?编程实现输入任意一个N位置,该数是多少?java实现
- Java 1,2,3,4能组成多少个互不相同且无重复数字的实现代码
- java实现分组算法,根据每组多少人来进行分组
- java编程题:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现