好吧!后来想了又想,发觉上面的那种做法有问题,修改之后就是下面的代码了,不知对不对?先分析一下吧,由楼主的意思可知每个细胞只能存活5天,在<5天的时候,每天的细胞数量都是前一天的两倍,在第5天的时候,第一天产生的细胞就不再分裂;在第6天的时候,第2天产生的所有细胞就不再分裂;第7天时,第3天产生的所有细胞就不再分裂,依此类推。。。。。。。
下面给出我思考的时候的两种方法吧,可能有没考虑到的地方还请指出!谢谢!
static void Main(string[] args)
{
/*
int[] num = new int[18];
num[0] = 0; //第0天的时候,数量为0
num[1] = 1; //第1天的时候,数量为1
for (int i = 2; i <= 17; i++)
{
if (i < 5)
{
num = num[i - 1] * 2; //当<5天的时候,每天的数量都是前一天的两倍
}
else
{
num = (num[i - 1] - num[i - 4]) * 2 + (num[i - 4] - num[i - 5]); //当>=5天的时候,每天的细胞数量=(前一天总数量-前一天不会分裂的数量)*2+前一天不会分裂也不会死的数量,而前一天不会分裂的数量=第(i-4)天的细胞数量,而不会分裂也不会死的数量=第(i-4)天新产生的细胞数量
}
}
Console.WriteLine(num[17]);*/
Console.WriteLine(Num(17)); //调用递归函数Num
Console.ReadKey();
}
//由于目前对算法不太了解,因此我也不知道递归函数是不是这样用
public static int Num(int n) //参数是经过的天数
{
int num;
if (n == 0)
{
num = 0;
}
else if (n == 1)
{
num = 1;
}
else
{
if (n < 5)
{
num = Num(n - 1) * 2;
}
else
{
num = (Num(n - 1) - Num(n - 4)) * 2 + (Num(n - 4) - Num(n - 5));
}
}
return num;
}
|