Discuz!NT
欢迎 游客 , 注册 | 登录 | 会员 | 界面 | 简洁版本 | 在线 | 帮助
商都网教育宝典宝库

发表新主题 回复该主题
本主题被查看1068次, 共2个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: 大牛生小牛的问题
张小峰
超级版主
UID: 14
来自:
精华: 4
积分: 313
帖子: 285
注册: 2007-8-23 10:27:00
状态: 离线
威望: 8.00
金钱: 75.55 元
只看楼主 2007-09-10 10:33
大牛生小牛的问题
问题:
          一只刚出生的小牛,4年后生一只小牛,以后每年生一只。现有一只刚出生的小牛,问20年后共有牛多少只?
思路:
          这种子生孙,孙生子,子子孙孙的问题,循环里面还有循环的嵌套循环,一看就知道是第归问题。
于是乎,第一个版本出现:
  public long Compute1(uint years)
        {
            //初始化为1头牛
            long count = 1;
            if (years <= 3)
            {
                return count;
            }
            int i = 4;
            while (i <= years)
            {
                int subYears = i - 3;
                count += Compute1((uint)(subYears));
                i++;
            }
            return (long)count;
        }
可是这种循环在循环的做法可要把cpu老兄累坏了,你不信输入一个100年测试一下上面的方法,我等了半天,都没结果,改进一下吧,老牛(牛魔王)和小牛(红孩儿,奶奶的串种了),具有相同的生育能力,他们的生育曲线是一样的,所以小牛可以复用老牛的生育经验亚,这样就解决了重复计算一只牛第n年的时候一共生多少只的问题了,当年龄比较大的时候,明显大大降低cpu的运算次数,下面是基于这种思路的算法
Hashtable table = new Hashtable();
        public long Compute(uint years)
        {
            //初始化为1头牛
            long count = 1;
            if (years <= 3)
            {
                return count;
            }
            int i = 4;
            while (i <= years)
            {
                int subYears = i - 3;
                if (table.ContainsKey(subYears))
                {
                    count = (long)table[subYears];
                }
                else
                {
                    count += Compute((uint)(subYears));
                }
                if (!table.ContainsKey(subYears))
                {
                    table.Add(subYears, count);
                }
                i++;
            }
            return (long)count;
        }用测试程序测试一下上面的推论吧,结果如下:
1)当输入years比较小的时候,第一种方法耗时短,但两者的时间基本在一个数量级上
2)当输入years比较大的时候,比如40以上的,第二种算法比第一种性能比在100以上,而且输入years越高,性能比越悬殊。
测试结果截图:
20年
#1  
张小峰
超级版主
UID: 14
来自:
精华: 4
积分: 313
帖子: 285
注册: 2007-8-23 10:27:00
状态: 离线
威望: 8.00
金钱: 75.55 元
只看楼主 2007-09-10 10:33
回复: 大牛生小牛的问题
20年

50年
#2  
发表新主题 回复该主题
本主题被查看1068次, 共2个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2008-10-06 22:13:37

版权所有 商都网教育宝典
         Powered by Discuz!NT 1.0.6666    Copyright © 2001-2008 Comsenz Inc.
Processed in 0 seconds