C#算法之大牛生小牛的问题高效解决方法_C#教程

问题:
  一只刚出生的小牛,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年

50年

源程序以及测试程序:http://xiazai.jb51.net/201606/yuanma/HowMoneyCows(jb51.net).rar

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, c#
, 循环
大牛生小牛
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-12-01 21:08:07

C#算法之大牛生小牛的问题高效解决方法_C#教程的相关文章

C语言实现的排列组合问题的通用算法、解决方法_C 语言

尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手.由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论.以在n个数中选取m(0<m<=n)个数为例,问题可分解为: 1. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止. 2. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m. 很明显,上述方法是一个递归的过程,也

针对近期百度算法变动关键词消失解决方法!

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 近期百度算法的大调整可害死了一些专业的seo公司和站长.网站关键字排名下滑,甚至部分关键词在百度上消失.针对这个情况站长们也束手无策,不知道怎么才能挽救回来以前的排名.很多站长朋友和seoer说这次是百度人工了自己的网站,我看了之后很纳闷,的确百度是人工了一些网站,这是百度的一贯作风.但是大规模人工你的网站,你认为可能吗.试问百度公司的员工每

排序 list-360 笔试题 下列哪个算法是对一个list排序的最快方法()

问题描述 360 笔试题 下列哪个算法是对一个list排序的最快方法() 下列哪个算法是对一个list排序的最快方法() 快速排序 冒泡排序 二分插入排序 线性排序 解决方案 我认为,是冒泡 .... 解决方案二: 二分插入排序法. 楼主可以去看Collections.sort(list);的排序算法,就是用的二分插入排序. 解决方案三: 二分. 不过 这也要看情况的, 数据大小的不同 是不一样的,若list里边只有一个数据呢?两个呢?. 解决方案四: 同时你也可以去看看 STL 里边的 lis

C#数据结构与算法揭秘五 栈和队列_C#教程

这节我们讨论了两种好玩的数据结构,栈和队列. 老样子,什么是栈, 所谓的栈是栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top) ,另一端是固定的,叫栈底(Bottom) .当栈中没有数据元素时叫空栈(Empty Stack).这个类似于送饭的饭盒子,上层放的是红烧肉,中层放的水煮鱼,下层放的鸡腿.你要把这些菜取出来,这就引出来了栈的特点先进后出(First in last out).   具体叙述,加下图. 栈通常记

发生&amp;amp;quot;指定的初始化向量(IV)与此算法的块大小不匹配&amp;amp;quot;错误提示的解决方法

问题描述 那位大侠能解答,调试代码过程中发生"指定的初始化向量(IV)与此算法的块大小不匹配"错误提示的解决方法,谢谢! 解决方案 解决方案二:遇到同样问题....解决方案三:IV的字节数必须等于SymmetricAlgorithm.BlockSize/8

追逐搜索引擎的算法太累 做好SEO有更好的方法

现在太多做SEO的人希望能破译搜索引擎的算法用在自己的网站上,从而获取良好的排名,我看到有很多做SEO的人天天盯着搜索引擎的算法去做优化.搜索引擎一有风吹草动就赶紧弄明白搜索引擎哪项算法作出调整了.其实这么做就像猫抓老鼠一样,很累,而且太不现实.据谷歌的官方说法是:谷歌一年对算法的调整不下500次.也就是说差不多一天都会进行一次半的调整,开发搜索引擎的人多聪明,人家整团队有多少人.我们怎么可能准确的抓住搜索引擎的算法呢,我们需要透过现象看本质,抓住一些本质的东西,尽量的把握一些不可按的东西.才能

逐步讲解快速排序算法及C#版的实现示例_C#教程

算法思想快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤.因此我的对快速排序作了进一步的说明:挖坑填数+分治法: 先

C#中使用基数排序算法对字符串进行排序的示例_C#教程

开始之前 假设最长字符串的长度是L,以L作为输入的长度, 然后假定所有的字符串都"补齐"到此长度,这个补齐只是逻辑上的,我们可以假想有一种"空字符", 它小于任何其它字符,用此字符补齐所有长度不足的字符串.例如:最长的字符串长度为9,有一个字符串A长度为6, 那么当比较第7位字符的时候,我们让A[7]为"空字符". 如果要包含所有的字符似乎并不容易,我们先定义一个字符集, 待排序字符串中的所有字符都包含在这个字符集里 //字符集 private

经典排序算法之冒泡排序(Bubble sort)代码_C#教程

经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第一次两两比较6 > 2交换(内循环) 交换前状态| 6 | 2 | 4 | 1 | 5 | 9 | 交换后状态| 2 | 6 | 4 | 1