您的位置:首页 > 编程语言 > Java开发

算算有多少头牛(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());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐