细胞分裂问题 求程序 最简单的方法

新细胞到第三个小时成熟,成熟后分裂出一个新的细胞,老的细胞每小时分裂出一个 新细胞,打印出每个 小时的细胞总数量; 初始成熟细胞是 一个;

哦!我以为第一个是新细胞。改了。
[code="java"]package test;

public class Count {
int[] cowNumber = new int[21];

public void count(int increaseCycle, int hours) { //传增长周期,和 用几个小时

    cowNumber[0] = 1;
    for (int currentHour = 1; currentHour <= hours; currentHour++) {
        if (currentHour < increaseCycle) {
            cowNumber[currentHour] = cowNumber[currentHour - 1] + 1;
        } else {
            cowNumber[currentHour] = cowNumber[currentHour - 1]
                    + cowNumber[currentHour - increaseCycle + 1];

        }
        System.out.println("第" + (currentHour) + "小时:"+ cowNumber[currentHour]);
    }
}

public static void main(String[] args) {
    int increaseCycle = 3;//三小时后
    int hours = 4;//第4小时

    Count c = new Count();
    c.count(increaseCycle, hours);
}

}[/code]

算法如下:(我测试了 :o :o )
[code="java"]package test;

public class Count {
int[] cowNumber = new int[21];

public void count(int increaseCycle, int hours) { //传增长周期,和 用几个小时
    hours = hours -2;//第三年之后才分裂。
    cowNumber[0] = 1;
    for (int currentHour = 1; currentHour <= hours; currentHour++) {
        if (currentHour < increaseCycle) {
            cowNumber[currentHour] = cowNumber[currentHour - 1] + 1;
        } else {
            cowNumber[currentHour] = cowNumber[currentHour - 1]
                    + cowNumber[currentHour - increaseCycle + 1];

        }
        System.out.println("第" + (currentHour+2) + "小时:"+ cowNumber[currentHour]);
    }
}

public static void main(String[] args) {
    int increaseCycle = 3;//三小时后
    int hours = 4;//第4小时

    Count c = new Count();
    c.count(increaseCycle, hours);
}

}[/code]

[code="java"]
public class Cell {
private int age=0;
private boolean isOld=false;
public Cell(){
}
public Cell(int age){
this.age=age;
}
Cell newCell(){
Cell c=new Cell();
return c;
}
void addAge(){
age++;
if(age==3)isOld=true;
}
boolean isOld(){
return isOld;
}

public static void main(String...args) throws Exception{
    ArrayList<Cell> ncs=new ArrayList<Cell>();
    ArrayList<Cell> ocs=new ArrayList<Cell>();
    Cell c=new Cell(1);
    ncs.add(c);
    while(true){
        for(int i=0;i<ncs.size();i++){
            Cell nc=ncs.get(i);
            nc.addAge();
            if(nc.isOld()){
                ocs.add(ncs.remove(i));
                i=i-1;
            }
        }
        for(Cell oc:ocs){
            Cell nc=oc.newCell();
            ncs.add(nc);
        }
        Thread.sleep(1000);
        System.out.println(ncs.size()+ocs.size());
    }
}

}
[/code]

补充:
分析一下原理:
时间 数量(第几小时内分裂出来的,也就是增加的)
第1小时: 1 //假设新细胞是第一小时增加的
第2小时:
第3小时: 1 //表示已经成熟,分裂出来另一个来,
第4小时: 1 //
第5小时: 1 1 //第三小时分裂出来的已经成熟,并分裂一个
第6小时: 1 1 1 //
第7小时: 1 1 1 1 1 //后面两个是在第五小时内分裂的新细胞在这个时候成熟了

最后计算第几小时的数量,把第几小时之前(包括这个小时)的都加起来。比如第6小时的总细胞=3+2+1+1+1=8

修改一下补充:
分析一下原理:
时间 数量(第几小时内分裂出来的,也就是增加的)
第1小时: 1 //假设新细胞是第一小时增加的
第2小时: 1
第3小时: 1 1 //表示已经成熟,分裂出来另一个来,
第4小时: 1 1 1 //
第5小时: 1 1 1 1 1 //第三小时分裂出来的已经成熟,并分裂一个
第6小时: 1 1 1 1 1 1 1 1 //
第7小时: 1 1 1 1 1 1 1 1 1 1 1 1 1

最后计算第几小时的数量,把第几小时之前(包括这个小时)的都加起来,最后加上最开始的那个。比如第6小时的总细胞=13+8+5+3+2+1+1+1=34

可以用递归,递归的效率差很多。
本来这是一个跟著名递归的算法(Fibonacci数列)有联系的。
如果用递归的话,看看这篇文章讲的很详细。
[url=http://blog.csdn.net/richard_ma/archive/2006/05/02/705773.aspx]http://blog.csdn.net/richard_ma/archive/2006/05/02/705773.aspx[/url]

[quote]我 感觉不太对,你 仔细看下,第一个是成熟细胞 最后 是 个等差+1 的 一个 数列 应该 是 这样的 吧,

1,2,3,5,8,12 [/quote]
分析一下:由于原来是一个成熟的细胞,第一小时已经分裂出来一个。因此第一小时内细胞总数为2.
序列为:2 3 5 8 13 21 34 ...
规律:一个数为前面两者之和。