A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一个新细胞一天之后分裂出一个新细胞。一个细胞总共会分裂3次,经过最后一次分裂后还能存活一天之后死亡。假定从第一天开始只有1个细胞,请用递归实现,第17天结束总共会有多少个细胞?

想了半天不知道怎么写,求大神赐教,求代码 - -

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

2 个回复

正序浏览
好吧!后来想了又想,发觉上面的那种做法有问题,修改之后就是下面的代码了,不知对不对?先分析一下吧,由楼主的意思可知每个细胞只能存活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;

        }


回复 使用道具 举报
好吧!想了半天,终于有头绪了,也不知道我做的对不对。先分析一下吧,由楼主的意思可知每个细胞只能存活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;

        }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马