题目要求
农场一头大母牛,
每年生头小母牛,
母牛五岁产母牛,
二十年上多少牛?
Farm.javaimport java.util.Vector;
public class Farm {    private Vector<Cow> cows=new Vector<Cow>();   //农场的牛群,用vector盛放       private int count=0;              //农场的总牛数           //得到总牛数       public int getCount() {               count=cows.size();               return count;       }           //增加一头牛       public void addCow(){              this.cows.addElement(new Cow());       }       //农场进入下一年,满了5岁的牛就产崽并长一岁,没满的就只长一岁     public void nextYear(){              Cow c=new Cow();            
                int before=cows.size();              for(int i=0;i<before;i++){     //写成 for(int i=0;i<cows.size();i++) 结果就不一样                c=cows.get(i);                     if(c.getAge()>=5){                            c.grow();                            c.lay(this);                                      }                     else{                            c.grow();              }       }       }          //为了显示方便,我就直接把main写在Farm类里面了       public static void main(String [] args){                     Farm farm=new Farm();              farm.addCow();              for(int i=1;i<=20;i++){                  farm.nextYear();                  System.out.println("第 "+i+"年有牛 :"+farm.getCount());              }                                   }}//母牛类class Cow {       private int age;             /* public Cow(){              this.age=0;       }*/       public void grow(){              this.age++;       }              public int getAge(){              return age;       }                     public void lay(Farm f){                     f.addCow();       }}

解决方案 »

  1.   

    1,对呀 你每循环一次 vector cows就增加一头母牛,rows的size()就增一 , 本来这头的母牛才0岁,干不了任何事,
    但size增加了,for语句又会遍历它,这头就得执行else语句了,所以预先保留需要增长年龄和生小牛的母牛集合就有必要了,
      

  2.   

    类似的问题用C做的,可以参考一下
    有一对老耗子,每个月都生一对小耗子,
    小耗子长到第三个月后(即从第四个月开始)
    每个月又生一对小耗子,
    假如耗子都不死,问2年后一共多少只耗子#include <stdio.h>
    int main()
    {
        int can[24] = {2, 2, 2};//can[0]表示1月有生育能力的耗子
        int cannot[24] = {2, 4, 6};//cannot[0]表示1月没有生育能力的耗子
        int i = 0;
        int rst;    
        for(i = 3; i < 23; i++)
        {
            can[i + 1] = can[i] + cannot[i - 2];
            cannot[i + 1] = cannot[i] - cannot[i - 2] + can[i + 1]; 
        }
        rst = can[23] + cannot[23];
        printf("%d\n", rst);
        return 0;
    }
      

  3.   

    LZ我想问一下,第一年的母牛应该产牛了把,可是看你的写法Farm farm=new Farm();  farm.addCow();  for(int i=1;i<=20;i++){    farm.nextYear();  System.out.println("第 "+i+"年有牛 :"+farm.getCount());  }第一头母牛也是从一岁长起,没有生产
      

  4.   

    在for循环里面,cows的size是会变的。
      

  5.   

    import java.util.List;
    import java.util.ArrayList;public class Farm {
       List<Cow> cow = new  ArrayList<Cow>();  
      
       
       public int getCount(){
       return this.cow.size();
       }
       
       public void addCow(){
       this.cow.add(new Cow());
       }
       
       public void addCow(int age){
       this.cow.add(new Cow(5));
       }
       
       public void nextYear(){
       
       //int before = cow.size(); 
       
       for(int i=0;i<cow.size();i++){ //这样不行么 为何一定要定义一个befor变量
       if(cow.get(i).getAge()>=5){
       cow.get(i).lays(this);
           cow.get(i).grow();
       }else
       cow.get(i).grow();
       
       }
       }
       
       public static void main(String args[]){
       Farm f = new Farm();
       f.addCow(5);
       for(int i=1;i<20;i++){
          f.nextYear();
          System.out.println("第"+i+"年一共有"+f.getCount()+"头牛");
       }
       
       }
       
    }class Cow{

    int age;
    public Cow(){
    this.age=0;
    }

    public Cow(int age){
    this.age=age;
    }

    public int getAge(){
    return this.age;
    }

    public void grow(){
    age++;
    }

    public void lays(Farm f){
    f.addCow();
    }
      
    }
      

  6.   

    //农场进入下一年,满了5岁的牛就产崽并长一岁,没满的就只长一岁   public void nextYear(){  Cow c=new Cow(); 那这里又新建Cow对象 这里的C对象永远都是0岁?那下面的IF条件大于5永远不成立?
      

  7.   


    package CSDN;import java.util.Scanner;public class alltext {
    public static void main(String[] args){
    int year;
    int totalCow = 0;
    Scanner input =  new Scanner(System.in);
    System.out.println("plase input the year:");
    year = input.nextInt();

    //计算牛的总数
    for (int i = 1; i <= year; i++) {
    totalCow = totalCow + new alltext().cow(i);

    }
    System.out.println(totalCow);
    }//计算某一年牛的数目的方法
    public int cow(int year){
    int count = 0; 
    if(year < 5){
    count = year;
    }else if(year >= 5){
    count = year + (year-3);
    }
    return count;
    }
    }
    //初学java,各位大侠看看怎样?
      

  8.   

    下面帮你改了下,初始化农场时是有一头6岁的牛
    import java.util.Vector;public class Farm { private Vector<Cow> cows = new Vector<Cow>(); // 农场的牛群,用vector盛放


    public Farm(){
    Cow cow = new Cow();
    cow.setAge(6);
    cows.addElement(cow);
    }
        
    private int count = 0; // 农场的总牛数 // 得到总牛数 public int getCount() {
    count = cows.size();
    return count; } // 增加一头牛 public void addCow() {
    Cow cow = new Cow();
    cow.setAge(1);
    this.cows.addElement(cow);
    } // 农场进入下一年,满了5岁的牛就产崽并长一岁,没满的就只长一岁 public void nextYear() { int before = cows.size(); for (int i = 0; i < before; i++) { // 写成 for(int i=0;i<cows.size();i++)
    // 结果就不一样
    // c=cows.get(i);
    if (cows.get(i).getAge() >= 5) {
    cows.get(i).grow();
    cows.get(i).lay(this);
    }
    else {
    cows.get(i).grow();
    } } } // 为了显示方便,我就直接把main写在Farm类里面了 public static void main(String[] args) { Farm farm = new Farm();
    for (int i = 1; i <= 20; i++) {
    farm.nextYear();
    System.out.println("第 " + i + "年有牛 :" + farm.getCount());
    }
    }
    }// 母牛类class Cow { private int age; /*
     * public Cow(){
     * 
     * this.age=0; }
     */ public void grow() { this.age++; } public int getAge() { return age; }
    public void setAge(int i) {
    this.age =i;

    } public void lay(Farm f) { f.addCow(); }}
      

  9.   

    就是嘛 楼主那个nextyear方法写错啦,
    //农场进入下一年,满了5岁的牛就产崽并长一岁,没满的就只长一岁   public void nextYear(){  Cow c=new Cow(); 那这里又新建Cow对象 这里的C对象永远都是0岁?那下面的IF条件大于5永远不成立? 除此之外 还是不懂为什么要弄一个before变量
      

  10.   

    我初学者,要我就用for带6个参数来算了 
      

  11.   

    主要是cows.size是动态增加的 for循环被两个分号分为三段 第一段赋值操作 for循环在开始时只运行一次 第二段是判断 每次循环前运行 第三段是数据处理 每次循环后运行 c.lay() 调用farm.add 导致cows每循环一次都会增加size 这个是增加倒无所谓了 要是你遇到remove操作那会报错的 所以才有Iterator的remove
    或者通过倒序来remove
      

  12.   

    面向过程的代码 初学者应该面向过程 个人意见哦 呵呵 public static int[] B(int[] c,int y){
    int l=c.length,_l=l;
    System.out.print(l+"  ");
    for(int a:c){
    if(a>=5){
    _l++;
    }
    System.out.print(a+",");
    }
    System.out.println();
    if(y==0){
    return c;
    }
    //B
    int[] _c=new int[_l];
    for(int i=0,_i=l,a;i<l;i++){
    a=c[i];
    if(a>=5){
    _c[_i++]=1;
    }
    _c[i]=++a;
    }
    return B(_c,--y);
    }

    public static void main(String[] args){
    int[] c=new int[]{5};
    B(c,6);
    }
      

  13.   

    这个问题就是 斐波那契 数列的一种变型
    1 2 3 4 5 6 
    F(n) = n (n < 7)
    F(n) = F(n - 1) + F(n - 5)   public static long cowCount(int year){
    return year < 7 ? year : cowCount(year - 1) + cowCount(year - 5);
    }
      

  14.   

    如果这个 year 比较大的话,就不能写成递归的,用递推写上去;也可以矩阵乘法来降低时间复杂度
      

  15.   

    就是斐波那契数列变种
    递归,或者循环都可以实现
    递归代码简单,循环效率高
    下面是用循环的public static long cowCount(int year)
      {
         long[] cowCnt=new cowCnt[year+1];//也可以用变量储存,用数组更清晰一点,但是略占空间复杂度
         for(int i=0;i<=year;++i)
         {
            if(year<6)
            {
               cowCnt[i]=i+1;
            }
            else
            {
               cowCnt[i]=cowCnt[i-1]+cowCnt[i-5];
            }
         }
         return cowCnt[year];
      }