面试题:农夫养牛问题
今天在群中,有人说到这个一个面试题:
一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,写出相关的代码或答题思路,最好用面向对象。
polaris将代码(Java实现)写了一下,如有不对的地方欢迎指出。同时也欢迎您给出自己的解法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | package com.polaris.test; import java.util.*; /** * 问题描述: * * 一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%, * 在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛, * 在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛, * 写出相关的代码或答题思路,最好用面向对象。 * @author polaris http://www.beijixing001.com * @version 1.0 */ public class ComputeCattleNum { // 保存所有母牛 private static List<Cattle> cows = new ArrayList<Cattle>(); // 保存所有当前农夫拥有的牛 private static List<Cattle> cattles = new ArrayList<Cattle>(); public static void main(String[] args) { // 第一头母牛 Cattle cow = new Cattle( 0 , 3 ); cows.add(cow); // 40年 for ( int i= 0 ;i< 40 ;++i) { // 大于等于12岁的牛送到屠宰场卖掉;同时每年,所有的牛 for ( int j= 0 ;j<cattles.size();++j) { Cattle temp = cattles.get(j); if (temp.getDead()) { cattles.remove(temp); } // 开始只有一头母猪,年龄不生长 if (i> 0 ) { cattles.get(j).grow(); } } // 母牛生小牛 for ( int j= 0 ;j<cows.size();++j) { Cattle calf = cows.get(j).bear(); if (calf!= null ) { if (calf.getSex()== 0 ) cows.add(calf); cattles.add(calf); } } } System.out.println( "40年后农夫拥有" + cattles.size() + "头牛" ); } } class Cattle { // 牛的雌雄:0代表雌,1代表雄 private int sex; // 牛的年龄 private int age; // 是否卖掉(已死) private boolean dead = false ; public Cattle( int sex, int age) { this .sex = sex; this .age = age; } /** * 生小牛 * @return 生出的小牛 */ public Cattle bear() { Cattle calf = null ; if ( this .sex== 0 ) { if ( this .age>= 3 && this .age<= 10 ) { calf = new Cattle(random(), 0 ); } else { //System.out.println("抱歉,此牛太小或太老,不能生育。"); } } else { //System.out.println("有没有搞错,公牛也想让它生小牛?"); } return calf; } private int random() { return ( int )Math.round(Math.random()); } /** * 长大一岁,如果当前大于等于12岁,则卖掉 */ public void grow() { if ( this .age>= 12 ) dead = true ; else this .age++; } public int getSex() { return this .sex; } public boolean getDead() { return this .dead; } } |

作者:Go语言中文网
出处:https://studygolang.com/subject/1
版权声明:转载请附上原文出处链接和本声明。欢迎大家访问Go语言中文网 https://studygolang.com。
微信扫描二维码,关注Go语言中文网,回复「电子书」,免费获取Go语言技术书籍。
出处:https://studygolang.com/subject/1
版权声明:转载请附上原文出处链接和本声明。欢迎大家访问Go语言中文网 https://studygolang.com。
微信扫描二维码,关注Go语言中文网,回复「电子书」,免费获取Go语言技术书籍。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?