国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

C#遞歸算法之打靶算法分析

2020-01-24 01:06:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

問(wèn)題: 一個(gè)設(shè)計(jì)運(yùn)動(dòng)員打靶,靶一共10環(huán),連開(kāi)10環(huán)打中90環(huán)的可能性有多少?請(qǐng)用第歸算法實(shí)現(xiàn)?

http://files.VeVB.COm/file_images/article/201606/2016061610500036.jpg

分析:

1)每次打靶可能的得分范圍是什么?
靶有10個(gè)環(huán),那么當(dāng)打中時(shí),分?jǐn)?shù)可為1-10,如果未打中得分為0,所以每次打靶得分的范圍為0-10,共有11中可能
2)計(jì)算有多少種可能最直接的方法:

打10次靶,分別記錄這10次打靶過(guò)程,用循環(huán)來(lái)完成

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槍?zhuān)梅譃?00的可能性,估計(jì)這種寫(xiě)法的要哭了
2)考慮不周全,如果第一次打靶得分為0,還有9次機(jī)會(huì),這9次機(jī)會(huì),就要求槍槍都是滿分,如果第二槍?zhuān)梅植皇?0,那第三槍不用打就知道可能沒(méi)有可能性了。就比如乒乓球比賽一樣,5局3勝制,如果進(jìn)行了3局都是一個(gè)人勝利的話,比賽這時(shí)候就可以宣告結(jié)束。而繼續(xù)下去就是浪費(fèi)時(shí)間和精力

采用第歸的方法來(lái)解決上述問(wèn)題

  第歸就是自己調(diào)自己,如果沒(méi)有結(jié)束限制的話,第歸的效果和dead loop是一樣的,但是第歸正常情況下都會(huì)有結(jié)束標(biāo)志,而且第歸的意義就在于完成循環(huán)層數(shù)不明確或者層數(shù)明確但是數(shù)值非常大的情形。使用它的注意點(diǎn)就是第歸函數(shù)肯定要具有一個(gè)或者一個(gè)以上的形參,沒(méi)有參數(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ù)中每次都得滿分,但能無(wú)法達(dá)到目標(biāo)分?jǐn)?shù)的時(shí)候,應(yīng)該退出第歸
3)如果沒(méi)有上述兩種情況,就應(yīng)該執(zhí)行第歸

實(shí)現(xiàn)代碼:

using System;namespace Test{ /// <summary> /// ShotScore 的摘要說(shuō)明。 /// </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è)問(wèn)題主要考察了程序員的邏輯思考能力和對(duì)第歸函數(shù)的應(yīng)用。十分簡(jiǎn)單。但邏輯一定要清楚,分析問(wèn)題的方法一定要準(zhǔn)確。

以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 托克逊县| 金秀| 长寿区| 江源县| 湖北省| 龙南县| 柘城县| 山东省| 乌兰察布市| 河池市| 正镶白旗| 伊宁市| 四平市| 壤塘县| 富宁县| 喀喇| 商南县| 卢湾区| 尚志市| 苗栗县| 澄城县| 滦平县| 合江县| 西城区| 全州县| 稷山县| 华池县| 大悟县| 泾阳县| 永修县| 张家界市| 西充县| 海丰县| 礼泉县| 鹰潭市| 阿巴嘎旗| 乌兰县| 航空| 丹阳市| 淅川县| 错那县|