黑马程序员技术交流社区
标题:
关于递归的一个问题。。有点绕。。求教
[打印本页]
作者:
郑建平
时间:
2013-5-25 23:20
标题:
关于递归的一个问题。。有点绕。。求教
一个新细胞一天之后分裂出一个新细胞。一个细胞总共会分裂3次,经过最后一次分裂后还能存活一天之后死亡。假定从第一天开始只有1个细胞,请用递归实现,第17天结束总共会有多少个细胞?
想了半天不知道怎么写,求大神赐教,求代码 - -
作者:
孤帆破浪
时间:
2013-5-26 01:07
好吧!想了半天,终于有头绪了,也不知道我做的对不对。先分析一下吧,由楼主的意思可知每个细胞只能存活5天,在<5天的时候,每天的细胞数量都是前一天的两倍,在第5天的时候,第一天产生的细胞就会死亡;在第6天的时候,第2天的所有细胞都会死亡;第7天时,第3天所有细胞都会死亡,依此类推。。。。。。。
下面给出我思考的时候的两种方法吧,有不对的地方还请指正!
static void Main(string[] args)
{
/*这一种是数组的方法
int[] num = new int[18]; //这里定义了一个从索引1开始的数组
num[1] = 1;
for (int i = 2; i <= 17; i++)
{
if (i < 5)
{
num
= num[i - 1] * 2; //这里<5天的时候,每天的数量都是前天的两倍
}
else
{
num
= num[i - 1] * 2 - num[i - 4]; //从第5天开始,都要减去前面第i-4天的细胞数量
}
}
Console.WriteLine(num[17]);*/
Console.WriteLine(Num(17));
Console.ReadKey();
}
//下面这种是递归函数的方法,由于我目前对算法接触不多,因此这种递归函数方法是我参考资料才做出来的,不知道对不对
public static int Num(int n)
{
int num;
if (n == 1)
{
num = 1;
}
else
{
if (n < 5)
{
num = Num(n - 1) * 2;
}
else
{
num = Num(n - 1) * 2 - Num(n - 4);
}
}
return num;
}
作者:
孤帆破浪
时间:
2013-5-26 11:36
好吧!后来想了又想,发觉上面的那种做法有问题,修改之后就是下面的代码了,不知对不对?先分析一下吧,由楼主的意思可知每个细胞只能存活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;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2