C#遞歸算法之打靶算法剖析。本站提示廣大學習愛好者:(C#遞歸算法之打靶算法剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#遞歸算法之打靶算法剖析正文
成績: 一個設計活動員打靶,靶一共10環,連開10環打中90環的能夠性有若干?請用第歸算法完成?
剖析:
1)每次打靶能夠的得分規模是甚麼?
靶有10個環,那末當打中時,分數可為1-10,假如未打中得分為0,所以每次打靶得分的規模為0-10,共有11中能夠
2)盤算有若干種能夠最直接的辦法:
打10次靶,分離記載這10次打靶進程,用輪回來完成
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) { //一種能夠 } } --- } } }
然則如許做有兩點缺乏:
1)假如標題改成連打1000槍,得分為900的能夠性,估量這類寫法的要哭了
2)斟酌不周全,假如第一次打靶得分為0,還有9次機遇,這9次機遇,就請求槍槍都是滿分,假如第二槍,得分不是10,那第三槍不消打就曉得能夠沒有能夠性了。就好比乒乓球競賽一樣,5局3勝制,假如停止了3局都是一小我成功的話,競賽這時候候便可以宣布停止。而持續下去就是糟蹋時光和精神
采取第歸的辦法來處理上述成績
第歸就是本身調本身,假如沒有停止限制的話,第歸的後果和dead loop是一樣的,然則第歸正常情形下都邑有停止標記,並且第歸的意義就在於完成輪回層數不明白或許層數明白然則數值異常年夜的情況。應用它的留意點就是第歸函數確定要具有一個或許一個以上的形參,沒有參數的第歸就構成了逝世輪回。並且第歸中函數每次挪用本身的時刻,須要當心謹嚴的掌握參數。盡可能避免逝世輪回的發生,第歸和棧關系親密。
要完成上述功效,第歸函數要完成的功效重要有:
1)當傳入確當前打靶次數為小於1,或許年夜於劃定次數的時刻,應當加入第歸函數的履行
2)當余下的打靶次數中每次都得滿分,但能沒法到達目的分數的時刻,應當加入第歸
3)假如沒有上述兩種情形,就應當履行第歸
完成代碼:
using System; namespace Test { /// <summary> /// ShotScore 的摘要解釋。 /// </summary> public class ShotScore { //總共有若干種能夠性 int SumRate = 0; //每次能夠射中的概率規模 int[] ScoreArray; //總共須要若干分 int totalScore=0; //一共能打若干次 int totalShot=0; //以後共打中環數 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; } //打夠次數了而且總共到達了預期環數 if(currentShot==totalShot) { //這類能夠性成立 SumRate++; return; } for(int i=0;i<ScoreArray.Length;i++) { Compute(currentShot+1,cNum+ScoreArray[i]); } } } }
最初成果為:92378
總結:這個成績重要考核了法式員的邏輯思慮才能和對第歸函數的運用。非常簡略。但邏輯必定要清晰,剖析成績的辦法必定要精確。
以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。