C#算法之大牛生小牛的問題高效解決方法
問題:
一只剛出生的小牛,4年后生一只小牛,以后每年生一只?,F(xiàn)有一只剛出生的小牛,問20年后共有牛多少只?
思路:
這種子生孫,孫生子,子子孫孫的問題,循環(huán)里面還有循環(huán)的嵌套循環(huán),一看就知道是第歸問題。
于是乎,第一個版本出現(xiàn):
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; }
可是這種循環(huán)在循環(huán)的做法可要把cpu老兄累壞了,你不信輸入一個100年測試一下上面的方法,我等了半天,都沒結(jié)果,改進(jìn)一下吧,老牛(牛魔王)和小牛(紅孩兒,奶奶的串種了),具有相同的生育能力,他們的生育曲線是一樣的,所以小牛可以復(fù)用老牛的生育經(jīng)驗(yàn)亞,這樣就解決了重復(fù)計算一只牛第n年的時候一共生多少只的問題了,當(dāng)年齡比較大的時候,明顯大大降低cpu的運(yùn)算次數(shù),下面是基于這種思路的算法
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; }
用測試程序測試一下上面的推論吧,結(jié)果如下:
1)當(dāng)輸入years比較小的時候,第一種方法耗時短,但兩者的時間基本在一個數(shù)量級上
2)當(dāng)輸入years比較大的時候,比如40以上的,第二種算法比第一種性能比在100以上,而且輸入years越高,性能比越懸殊。
測試結(jié)果截圖:
20年
50年
源程序以及測試程序:http://xiazai.jb51.net/201606/yuanma/HowMoneyCows(jb51.net).rar
以上就是本文的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持我們。
欄 目:C#教程
下一篇:C#控制Excel Sheet使其自適應(yīng)頁寬與列寬的方法
本文標(biāo)題:C#算法之大牛生小牛的問題高效解決方法
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6415.html
您可能感興趣的文章
- 01-10基于C#代碼實(shí)現(xiàn)九宮格算法橫豎都等于4
- 01-10經(jīng)典排序算法之冒泡排序(Bubble sort)代碼
- 01-10C#中使用基數(shù)排序算法對字符串進(jìn)行排序的示例
- 01-10C#遞歸算法尋找數(shù)組中第K大的數(shù)
- 01-10逐步講解快速排序算法及C#版的實(shí)現(xiàn)示例
- 01-10C#用遞歸算法解決經(jīng)典背包問題
- 01-10C#遞歸算法之歸并排序
- 01-10C#用遞歸算法實(shí)現(xiàn):一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、
- 01-10C#遞歸算法之分而治之策略
- 01-10C#遞歸算法之快速排序


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文