`
fatesymphony
  • 浏览: 1694 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

经典-农夫养牛的问题

阅读更多
  问题描述:一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛……问农夫10年后有多少头牛?n年呢?(用JAVA实现)。

/**
 * 农夫养牛。
 * 
 * @author ZouYong
 * 
 */
public class RaiseCowByRecursive2 {

	/**
	 * 牛的生产周期。
	 */
	private static final int cycle = 3;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.print("年数:");
		Scanner sc = new Scanner(System.in);
		int y = sc.nextInt();
		System.out.println("牛的总数:" + getCow(y));
	}

	private static long getCow(int y) {
		// 需要生产。
		if (y > cycle) {
			return getCow(y - 1) + getCow(y - cycle);
		}
		// 不生产,直接返回1。
		return 1;
	}

}


  小弟初次发帖,希望各位前辈别投隐藏,谢谢。
分享到:
评论
31 楼 咖啡豆子 2011-02-22  
sulong 写道
typhoon466 写道
sulong 写道
不像是个程序题,倒是一个数学题



老题目了~~以前看到好几次了。

世间万物都是对象,神马都能抽象。
所以,是楼主自己把程序题解得像数学题。

学JAVA的应该多用面向对象思维去抽象,而不是算法,人家和尚就写得不错~

http://never-say-never.iteye.com/blog/851512






不完赞同你的观点。程序,不论是由哪种语言编写的,是面向过程的,还是面向对象的,还是面向规则的,等等,它的意义都在于解决某个问题。比如这题,只关心N年后牛的数量,而不关心计算过程,也不关心是否模拟了牛的繁殖过程,甚至于连是不是牛都不关心,在这种情况下非要模拟牛,以及牛的繁殖过程,那就是为了面向对象而面向对象,并不十分合理。用面向对象,不代表用不着算法,面向对象只是种程序设计理念,但是只要是计算机程序,总会有算法的问题。

同意
30 楼 sulong 2011-02-17  
typhoon466 写道
sulong 写道
不像是个程序题,倒是一个数学题



老题目了~~以前看到好几次了。

世间万物都是对象,神马都能抽象。
所以,是楼主自己把程序题解得像数学题。

学JAVA的应该多用面向对象思维去抽象,而不是算法,人家和尚就写得不错~

http://never-say-never.iteye.com/blog/851512






不完赞同你的观点。程序,不论是由哪种语言编写的,是面向过程的,还是面向对象的,还是面向规则的,等等,它的意义都在于解决某个问题。比如这题,只关心N年后牛的数量,而不关心计算过程,也不关心是否模拟了牛的繁殖过程,甚至于连是不是牛都不关心,在这种情况下非要模拟牛,以及牛的繁殖过程,那就是为了面向对象而面向对象,并不十分合理。用面向对象,不代表用不着算法,面向对象只是种程序设计理念,但是只要是计算机程序,总会有算法的问题。
29 楼 kingsword588 2011-02-17  
这样冒失还要要考虑母牛是否会流产....
28 楼 咖啡豆子 2011-02-14  
我用的数学归纳法:

理想情况:如果题目是新生牛从第一年开始每年就产出一头牛,那么每年牛的总数就是一个成2倍增长的数列。

实际题目:这里有点小小的区别就是新生的牛要第三年开始才产出,是理想情况下的一个变种。

设第n年牛的总数为S(n), 按理想情况 S(n) = 2×S(n-1), 实际题目中牛要到3岁才生育,所以理想情况会比实际题目中多出一部分,就是理想情况下到第n年前3岁以下的牛多生产出来的那部分,按S(n) = 2×S(n-1)的规律,到第n年前,3岁以下的牛多生产的那部分正好也就是3岁以下的牛自身的数目。只要用理想情况S(n)减去第n年前3岁以下牛的数目。

第n年前不满3岁牛的数目 = S(n-1) - S(n-3)

所以实际情况下 S(n) = 2×S(n-1) - [S(n-1) - S(n-3)] = S(n-1) + S(n-3)

S(1) = 1;
S(2) = 1;
S(3) = 1;
S(4) = 3;
S(5) = 4;
S(6) = 6;
S(7) = 9;
.........

代码的话用递归应该就可以了
27 楼 liugaojian13135 2011-02-14  
很多方法都能搞定。只是你能不能算出它最后一代是第几代呀。
26 楼 snowflate_summer 2011-02-14  
dsjt 写道
清风_夕瑶 写道
这个问题说实在真有点无聊,假设的前提都是生母牛

哈哈!
没公牛再NB的母牛也生不了啊!!



就不允许农场主自己来么?
25 楼 typhoon466 2011-02-14  
heyJoe 写道
typhoon466 写道
sulong 写道
不像是个程序题,倒是一个数学题



老题目了~~以前看到好几次了。

世间万物都是对象,神马都能抽象。
所以,是楼主自己把程序题解得像数学题。

学JAVA的应该多用面向对象思维去抽象,而不是算法,人家和尚就写得不错~

http://never-say-never.iteye.com/blog/851512






还是这位妹子说的有道理, 顶啊!



果酱,果酱~


24 楼 kimmking 2011-02-14  
广义 fibonacci,
23 楼 javazeke 2011-02-14  
无聊的概率问题
22 楼 heyJoe 2011-02-14  
typhoon466 写道
sulong 写道
不像是个程序题,倒是一个数学题



老题目了~~以前看到好几次了。

世间万物都是对象,神马都能抽象。
所以,是楼主自己把程序题解得像数学题。

学JAVA的应该多用面向对象思维去抽象,而不是算法,人家和尚就写得不错~

http://never-say-never.iteye.com/blog/851512






还是这位妹子说的有道理, 顶啊!
21 楼 kaneg 2011-02-14  
清风_夕瑶 写道
这个问题说实在真有点无聊,假设的前提都是生母牛

的确,用牛在这里显然有悖常识。用细胞分裂来举例倒可以说的通
20 楼 螺丝很冷 2011-02-14  
小弟无聊,也写了一个,单纯实现功能没有处理异常,
class Cow {
	private int age;

	public Cow() {
		age = 0;
	}

	public void growUp() {
		age++;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

public class Test{
	public static int getCow(int year) {
		ArrayList<Cow> cows = new ArrayList<Cow>();
		cows.add(new Cow());
		for (int i = 0; i < year; i++) {
			int size = cows.size();
			for (int j = 0; j < size; j++) {
				Cow cow = cows.get(j);
				cow.growUp();
				if (cow.getAge() >= 3) {
					cows.add(new Cow());
				}
			}
		}
		return cows.size();
	}

	public static void main(String agrs[]) {
		for (int i = 1; i <= 20; i++) {
			System.out.println(i + "年有" + getCow(i) + "头牛");
		}
	}
}
19 楼 zzm_fly2004 2011-02-14  
哈哈,挺有意思的题目,自己也尝试写了一段
ps:按我理解,母牛应该是4岁开始就可以生小牛了

package demo;

/**
 * 母牛
 * @author xxxx
 *
 * 2011-2-14
 */
public class Cow {
	
	/**
	 * 母牛的年龄
	 */
	private int age;
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	/**
	 * 母牛分娩(即生小牛,这里当然假设生出来的是小母牛)
	 * @return
	 */
	public Cow labor() {
		Cow cow = new Cow();
		cow.setAge(0);
		return cow;
	}
	
}


package demo;

import java.util.HashSet;
import java.util.Set;

/**
 * 农场
 * @author xxxx
 *
 * 2011-2-14
 */
public class Farm {
	
	//	处于繁殖期的母牛(即年龄大于3岁的)
	private Set<Cow> propagateCows = new HashSet<Cow>();
	
	//  处于成长期的母牛(即年龄处于1~3岁之间的母牛) 
	private Set<Cow> growingCows = new HashSet<Cow>();
	
	
	/**
	 * 开一个农场,一头母牛起家
	 * @param cow
	 */
	public Farm(Cow cow) {
		if(cow.getAge() <= 3)
			growingCows.add(cow);
		else
			propagateCows.add(cow);
	}
	
	/**
	 * 农场经营发展
	 * @param year 发展多少年
	 */
	public void develop(int year) {
		Set<Cow> tmp = new HashSet<Cow>();
		//	每一年,都有新变化
		for(int i=0; i <= year; i++) {
			//	1、处理处于成长期的母牛			
			for(Cow cow : growingCows) {
				int age = cow.getAge();
				if(age == 3) {
					//	如果母牛已经三岁了,就应该把它拉进繁殖期的牛栏了
					tmp.add(cow);
				}
				age++;
				cow.setAge(age);
				
			}
			
			
			//	2、处理该生小母牛的老母牛了
			for(Cow cow : propagateCows) {
				//	每天繁殖期的母牛都要生一只小牛
				Cow newCow = cow.labor();
				//	将生出来的小牛放到成长期的牛群中去
				growingCows.add(newCow);
				
				int age = cow.getAge();
				age++;
				cow.setAge(age);
			}
			
			growingCows.removeAll(tmp);	//移除那些已经超龄的小母牛
			propagateCows.addAll(tmp);	//加入待繁殖的母牛
			
			tmp.clear();
			
		}
	}
	
	/**
	 * 获取农场的母牛总数
	 * @return
	 */
	public int getCowsCount() {
		System.out.println("成长期的母牛数量:"+growingCows.size());
		System.out.println("繁殖期的母牛数量:"+propagateCows.size());
		return growingCows.size() + propagateCows.size();
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Cow cow = new Cow();
		cow.setAge(0);
		
		Farm farm = new Farm(cow);
		farm.develop(20);
		System.out.println(String.format("辛勤创业20年之后,我已拥有%d头母牛,不知那时候,我是否买能买一处安乐窝", 
				farm.getCowsCount()));
	}

}


18 楼 dsjt 2011-02-14  
清风_夕瑶 写道
这个问题说实在真有点无聊,假设的前提都是生母牛

哈哈!
没公牛再NB的母牛也生不了啊!!
17 楼 jx822 2011-02-14  
清风_夕瑶 写道
这个问题说实在真有点无聊,假设的前提都是生母牛


即使是母牛,没有公牛交配,能行么?
16 楼 typhoon466 2011-02-14  
sulong 写道
不像是个程序题,倒是一个数学题



老题目了~~以前看到好几次了。

世间万物都是对象,神马都能抽象。
所以,是楼主自己把程序题解得像数学题。

学JAVA的应该多用面向对象思维去抽象,而不是算法,人家和尚就写得不错~

http://never-say-never.iteye.com/blog/851512





15 楼 IcyFenix 2011-02-14  
清风_夕瑶 写道
这个问题说实在真有点无聊,假设的前提都是生母牛


笑喷了。

最好生出变异了可实行无性繁殖的,能长期存活的,精确定时生殖的,不会生双(多)胞胎的、生育不会难产的牛!
14 楼 cclsw07 2011-02-14  
生个同性恋母牛出来怎么办?
13 楼 iceofst 2011-02-14  
这应该算是 斐波那契数列一类的 问题.
12 楼 TANHAIWEI 2011-02-14  
/**
 * 母牛,三岁之后每年可以产子一头
 */
class Cow
{
	public Cow(String name)
	{
		this.name = name;
		age = 0;
		children = new ArrayList();
		isProducted = false;
	}
	
	/**
	 * 名称
	 */
	private String name;
	
	/**
	 * 年龄
	 */
	private int age;
	
	/**
	 * 孩子
	 */
	private List children;
	
	/**
	 * 生育时间
	 */
	private int cycle = 3;
	
	private boolean isProducted;
	
	public String getName()
	{
		return name;
	}

	public int getAge()
	{
		return age;
	}

	public List getChildren()
	{
		return children;
	}
	
	/**
	 * 长大了,增加一岁,又可以生崽了
	 */
	public void addAge()
	{
		age++;
		isProducted = false;
	}
	
	/**
	 * 只有大于三岁并且当年没有生育过的牛才能产子
	 * @return
	 */
	public boolean addChild()
	{
		if(cycle > age || isProducted)
		{
			return false;
		}
		else
		{
			boolean addFlag = children.add(new Cow(name+"_"+children.size()));
			if(addFlag)
			{
				System.out.println(name + " product a new cow " + ((Cow)(children.get(children.size()-1))).getName());
			}
			
			return addFlag;
		}
	}
	
	/**
	 * 整个由此牛发展出来的家族产子
	 * @return
	 */
	public void addFamily()
	{
		addChild();
		for(int i=0;i<children.size();i++)
		{
			((Cow)children.get(i)).addAge();
			((Cow)children.get(i)).addFamily();
		}
	}
	
	/**
	 * 整个由此牛发展出来的家族的数量
	 * @return
	 */
	public int getFamilyCount()
	{
		int withChildrenNum = 1;
		if(0 >= children.size())
		{
			return withChildrenNum;
		}
		
		for(int i=0;i<children.size();i++)
		{
			withChildrenNum +=((Cow)children.get(i)).getFamilyCount();
		}
		
		return withChildrenNum;
	}
}

相关推荐

    经典的农夫养牛问题(面向对象和递归)

    在编程领域,经典的问题往往能够激发我们思考不同的解决策略,"农夫养牛问题"就是这样一道题。问题的核心是计算在一定年数后,一头牛繁殖的后代总数,假设每头牛三年后开始生育,每年生育一头牛,并且新生的小牛同样...

    20210719-中泰证券-农夫山泉-9633.HK-十年磨一剑,打造“天然健康”的深厚护城河.pdf

    20210719-中泰证券-农夫山泉-9633.HK-十年磨一剑,打造“天然健康”的深厚护城河.pdf

    农夫养牛问题java解决

    一个农夫养了一头牛,三年后,这头牛每年会生出1头牛,生出来的牛三年后,又可以每年生出一头牛 //……问农夫10年后有多少头牛?n年呢?

    农夫养牛问题几种解法源码

    这个"农夫养牛问题"是一个典型的数学与编程相结合的问题,它涉及到递归和指数增长的概念。在这个问题中,农夫有一头牛,这头牛在第三年之后每年会生出一头新的牛,而新生的牛在经历三年同样会每年生出一头牛。我们要...

    图的应用------农夫过河

    农夫过河。一个农夫带着一只狼,一只羊和一些菜过河。河边只有一条一船,由 于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊 要吃菜,请问农夫如何才能使三样东西平安过河。

    C语言农夫过河实验报告.doc

    这篇实验报告探讨的是一个经典的逻辑问题——“农夫过河”,通过C语言来实现解决方案。实验的主要目标是理解递归函数的概念,掌握位运算,并使用CodeBlocks集成开发环境进行编程和调试。实验中,农夫需要携带一只羊...

    数据结构农夫过河问题

    【数据结构农夫过河问题】是一个经典的逻辑与算法题目,涉及到广度优先搜索(BFS)的应用。问题的核心在于如何安全地通过一系列操作将狼、羊和白菜都运送到河的对岸,同时保证在农夫不在场时,任何可能导致危险的...

    20210228-头豹研究院-农夫山泉-9633.HK-2021年农夫山泉企业研究报告.pdf

    农夫山泉作为知名的饮料生产企业,在中国软饮料市场中占据了重要的地位。从提供的文件内容来看,我们可以了解到农夫山泉企业研究报告的几个核心知识点。 首先,中国软饮料行业在全球范围内具有巨大的市场规模,已...

    20210311-国泰君安-农夫山泉-9633.HK-首次覆盖报告:水之王者,乘风起航.pdf

    农夫山泉作为国内著名的饮料品牌,一直以生产天然水和饮料为主营业务。其在激烈的市场竞争中脱颖而出,依靠差异化营销和对消费者需求的深刻理解,形成了强大的盈利能力。国泰君安出具的这份报告深入分析了农夫山泉的...

    危机公关事件分析-农夫山泉事件分析XXXX0617.pptx

    事件起始于3月,农夫山泉的产品被曝出水中含有黑色不明物、棕色漂浮物以及水源地周围存在垃圾问题,引发公众对产品质量的质疑。这一系列事件对企业形象造成了严重影响。 4月10日,《京华时报》报道了农夫山泉瓶装水...

    数据结构-农夫过河代码

    基于c语言的农夫过河实现代码,数据结构课程设计,数据结构大作业

    20210719-方正证券-农夫山泉-9633.HK-立足天然与健康,锐意进取的饮料巨头.pdf

    水源地如果遭受污染或破坏,以及发生严重的产品安全问题,都可能导致公司品牌形象受损,进而影响公司的市场表现。因此,农夫山泉在追求发展的同时,也需要谨慎处理这些潜在风险。 综上所述,农夫山泉在包装水行业...

    危机公关案例-农夫山泉事件分析.pptx

    农夫山泉在2013年经历了一场严重的公关危机,事件起源于3月,消费者反映在其瓶装水中发现黑色不明物、棕色漂浮物以及水源地垃圾问题,这导致了公众对农夫山泉产品质量的信任危机,被称为“质量门”。4月10日,《京华...

    第一上海-农夫山泉-9633.HK-双引擎业务组装,包装饮用水及软饮料行业赛道持续领跑.rar

    标题中的“第一上海-农夫山泉-9633.HK-双引擎业务组装,包装饮用水及软饮料行业赛道持续领跑”表明这是一份关于农夫山泉公司的研究报告,重点探讨了公司在包装饮用水和软饮料行业的业务表现,以及其在港股市场的表现...

    农夫过河问题【代码+流程图+可执行文件】

    《农夫过河问题:深度优先遍历图的解决方案》 农夫过河问题是一个经典的逻辑谜题,它涉及到在有限的资源和条件...通过理解和实现这个经典问题的解决方案,我们可以更好地掌握这些基础概念,并将其应用于更广泛的领域。

    20210228农夫山泉-9633.HK-2021年农夫山泉企业研究报告.rar

    8. **风险与挑战**:识别农夫山泉面临的外部风险(如政策变动、经济波动)和内部风险(如供应链管理、产品质量问题),以及公司如何应对这些挑战。 9. **未来展望**:基于以上分析,头豹研究院可能会提供对农夫山泉...

    农夫过河问题的算法与实现.doc

    农夫过河问题的算法与实现 农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸,需要安全运到北岸。这类问题的实质是系统的状态问题,要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。...

    20210528-东方证券-农夫山泉-9633.HK-包装水长坡厚雪,软饮翘楚欣欣向荣.pdf

    东方证券发布的这份研究报告主要聚焦于农夫山泉股份有限公司(股票代码:9633.HK),这是一家中国的饮料企业,尤其以包装水和软饮料产品闻名。报告从多个角度对农夫山泉进行了全面的分析,并给出了投资建议和评级。 ...

    农夫过河问题,经典数据结构

    农夫过河问题是一个经典的逻辑谜题,也常被用作介绍和实践数据结构及算法的案例。问题背景是这样的:一个农夫需要将自己、一只狼、一只羊和一捆白菜运过一条河,但他只有一条小船,每次只能载他自己和一件物品过河。...

Global site tag (gtag.js) - Google Analytics