C#遞歸算法之打靶算法分析
問題: 一個(gè)設(shè)計(jì)運(yùn)動(dòng)員打靶,靶一共10環(huán),連開10環(huán)打中90環(huán)的可能性有多少?請(qǐng)用第歸算法實(shí)現(xiàn)?
分析:
1)每次打靶可能的得分范圍是什么?
靶有10個(gè)環(huán),那么當(dāng)打中時(shí),分?jǐn)?shù)可為1-10,如果未打中得分為0,所以每次打靶得分的范圍為0-10,共有11中可能
2)計(jì)算有多少種可能最直接的方法:
打10次靶,分別記錄這10次打靶過程,用循環(huán)來完成
for(int i1=0;i1<=10;i++) { for(int i2=0;i2<=10;i2++) { for(int i3=0;i3<=10;i3++) { --- for(int i10=0;i10<=10;i10++) { if(i1+i2+i3+……+i10=90) { //一種可能 } } --- } } }
但是這樣做有兩點(diǎn)不足:
1)如果題目改為連打1000槍,得分為900的可能性,估計(jì)這種寫法的要哭了
2)考慮不周全,如果第一次打靶得分為0,還有9次機(jī)會(huì),這9次機(jī)會(huì),就要求槍槍都是滿分,如果第二槍,得分不是10,那第三槍不用打就知道可能沒有可能性了。就比如乒乓球比賽一樣,5局3勝制,如果進(jìn)行了3局都是一個(gè)人勝利的話,比賽這時(shí)候就可以宣告結(jié)束。而繼續(xù)下去就是浪費(fèi)時(shí)間和精力
采用第歸的方法來解決上述問題
第歸就是自己調(diào)自己,如果沒有結(jié)束限制的話,第歸的效果和dead loop是一樣的,但是第歸正常情況下都會(huì)有結(jié)束標(biāo)志,而且第歸的意義就在于完成循環(huán)層數(shù)不明確或者層數(shù)明確但是數(shù)值非常大的情形。使用它的注意點(diǎn)就是第歸函數(shù)肯定要具有一個(gè)或者一個(gè)以上的形參,沒有參數(shù)的第歸就形成了死循環(huán)。而且第歸中函數(shù)每次調(diào)用自己的時(shí)候,需要小心謹(jǐn)慎的控制參數(shù)。盡量防止死循環(huán)的產(chǎn)生,第歸和棧關(guān)系密切。
要實(shí)現(xiàn)上述功能,第歸函數(shù)要完成的功能主要有:
1)當(dāng)傳入的當(dāng)前打靶次數(shù)為小于1,或者大于規(guī)定次數(shù)的時(shí)候,應(yīng)該退出第歸函數(shù)的執(zhí)行
2)當(dāng)余下的打靶次數(shù)中每次都得滿分,但能無法達(dá)到目標(biāo)分?jǐn)?shù)的時(shí)候,應(yīng)該退出第歸
3)如果沒有上述兩種情況,就應(yīng)該執(zhí)行第歸
實(shí)現(xiàn)代碼:
using System; namespace Test { /// <summary> /// ShotScore 的摘要說明。 /// </summary> public class ShotScore { //總共有多少種可能性 int SumRate = 0; //每次可能命中的幾率范圍 int[] ScoreArray; //總共需要多少分 int totalScore=0; //一共能打多少次 int totalShot=0; //當(dāng)前共打中環(huán)數(shù) public ShotScore(int[] sa,int ts,int t) { this.ScoreArray = sa; this.totalShot = ts; this.totalScore = t; } public int GetSum() { return SumRate; } public void Compute(int currentShot,int cNum) { //打多打少都不行 if(currentShot<0||currentShot>totalShot) { return; } //以后槍槍都中10都不能滿足條件,game over if(((totalShot-currentShot+1)*10)<(totalScore-cNum)) { return; } //打夠次數(shù)了并且總共達(dá)到了預(yù)期環(huán)數(shù) if(currentShot==totalShot) { //這種可能性成立 SumRate++; return; } for(int i=0;i<ScoreArray.Length;i++) { Compute(currentShot+1,cNum+ScoreArray[i]); } } } }
最后結(jié)果為:92378
總結(jié):這個(gè)問題主要考察了程序員的邏輯思考能力和對(duì)第歸函數(shù)的應(yīng)用。十分簡(jiǎn)單。但邏輯一定要清楚,分析問題的方法一定要準(zhǔn)確。
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10C#一個(gè)簡(jiǎn)單的定時(shí)小程序?qū)崿F(xiàn)代碼
- 01-10微信開放平臺(tái)之網(wǎng)站授權(quán)微信登錄功能
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#編程自學(xué)之類和對(duì)象
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一
- 01-10C#編程自學(xué)之流程控制語句
- 01-10C#基于委托實(shí)現(xiàn)多線程之間操作的方法


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(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)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法