黑马程序员技术交流社区

标题: 关于递归的一个问题。。有点绕。。求教 [打印本页]

作者: 郑建平    时间: 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