C#第5章 C#程序的算法選講_第1頁
C#第5章 C#程序的算法選講_第2頁
C#第5章 C#程序的算法選講_第3頁
C#第5章 C#程序的算法選講_第4頁
C#第5章 C#程序的算法選講_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、1.徐恒英辦公室:B305,面向?qū)ο缶幊藽#編程;2.在第五章中,選擇了C#編程算法。有很多關(guān)于算法的書,比如著名的計算機編程藝術(shù)和算法導(dǎo)論。常用算法示例1。遞歸方法2。遞歸方法3。窮舉方法4。貪婪算法5。迭代法6。數(shù)值積分3,1。遞歸方法:用幾個可重復(fù)的簡單操作(規(guī)則)來描述復(fù)雜問題的方法。通過已知的條件,利用特定的關(guān)系得到中間推論,直到得到結(jié)果。一個復(fù)雜的計算過程被轉(zhuǎn)換成一個簡單的過程,重復(fù)幾次,每次從舊值推導(dǎo)出一個新值,舊值被新值替換。該算法利用了計算機的快速和不懈的機器特性。例如斐波納契數(shù)列:1,1,2,3,5,8,4,例1:遞歸法的斐波那契數(shù)列的第n個值,初始值:f1=1,F(xiàn)2=1;

2、循環(huán):從i=3開始,f3=f1 f2,然后迭代f2=f3,f1=f2,然后執(zhí)行下一個循環(huán)。5,私有無效按鈕1_Click(對象發(fā)送者,事件參數(shù)e) int f1=1,f2=1,F(xiàn)3=0;整數(shù)n=轉(zhuǎn)換。至16(文本框1)。文本);如果(n=1 | | n=2)F3=1;else for(int I=3;I=n;I)F3=f1 F2;f1=f2f2=f3文本框2。文本=轉(zhuǎn)換。ToString(F3);例2:猴子吃桃子,猴子吃桃子:小猴子每天摘幾個桃子,當(dāng)天吃掉一半以上;第二天,我吃了一半以上剩下的桃子;之后,我會每天吃剩下的一半和一個桃子,第十天早上我想吃的時候只剩下一個桃子。我問小猴子那天摘了多

3、少桃子。假設(shè)第n天的桃子是xn,那么前一天的桃子編號是xn-1:7,私有無效按鈕1 _ click(對象發(fā)送者,事件參數(shù)e)int lastn=1;/前一天桃子的數(shù)量,有一個文本框1。text=第10天上午1 n ;for(int I=9;I 0;-I)lastn=(lastn 1)* 2;文本框1。Text=lastn。ToString()rn;遞歸方法,程序調(diào)用自身的編程技巧稱為遞歸。方法(或靜態(tài)方法)可以用C#定義,它在內(nèi)部調(diào)用自己。遞歸可以將一個大而復(fù)雜的問題轉(zhuǎn)化為一個與原問題相似的小問題。遞歸問題:你可以用你自己的結(jié)構(gòu)描述你自己的問題,例如,階乘。私有整數(shù)事實(整數(shù)n ) n=n *

4、事實(n-1);9,在遞歸處理中,它是通過堆棧實現(xiàn)的。堆棧存儲形式參數(shù)、局部變量和返回地址。遞歸過程:每次你調(diào)用自己的時候,當(dāng)前的參數(shù)被推到堆棧中,直到達到遞歸結(jié)束條件。回歸過程:不斷從堆棧中彈出當(dāng)前參數(shù),直到堆棧為空。遞歸,回歸,10,示例3:階乘n的遞歸方法!如果(n=1) n=1,則為私有整數(shù)(整數(shù)n);否則n=n *事實(n-1);返回n;私有無效按鈕1_Click(對象發(fā)送者,事件參數(shù))int n=轉(zhuǎn)換。至16(文本框1)。文本);文本框2。文本=事實(n)。ToString();11,例4:遞歸法求斐波那契數(shù)列的第n個值,公共靜態(tài)int斐波那契(int I)/計算數(shù)列1,1,2,3

5、,5,8的I值.如果(i=0)返回0;如果(i=1)返回1;否則返回斐波納契(i - 1)斐波納契(I-2);私有無效按鈕1_Click(對象發(fā)送者,事件參數(shù))int n=轉(zhuǎn)換。至16(文本框1)。文本);文本框2。文本=斐波那契(n)。ToString();窮舉法,又稱枚舉法、枚舉法、試錯法和蠻力法。逐一測試所有可能的情況,并判斷條件是否滿足,通常是通過循環(huán)實現(xiàn)的。如密碼解密,則逐個計算密碼,直到找到真正的密碼。例如,一個已知為四位數(shù)字并由所有數(shù)字組成的密碼可能有10,000個組合,因此最多嘗試10,000次后就可以找到正確的密碼。理論上,任何一種密碼都可以用這種方法破解,但問題只在于如何縮

6、短試錯時間。因此,一些人使用電腦來提高效率,而另一些人使用字典來縮小密碼組合的范圍。,13,例5:水仙花的數(shù)量是用窮舉法計算的?!八苫〝?shù)”是指一個三位數(shù)的整數(shù),其每位數(shù)的三次和等于數(shù)本身。編程將在文本框1中顯示所有水仙花,并在文本框2中顯示數(shù)字。有4朵水仙花:153,370,371和407。14,私有無效按鈕1_Click(對象發(fā)送者,事件參數(shù)e)整數(shù),I=0;int a,b,c;/100、10和1位上的數(shù)字代表(數(shù)字=100;num1000數(shù)量)a=數(shù)量/100;/取百位數(shù)上的數(shù)字b=(num-a * 100)/10;/取十位數(shù)c=num-a * 100-b * 10;/如果(num=a

7、* a * ab * b * BC * c * c)text box 1 . text=num . tostring()則取數(shù)字;我;文本框2。文本=I . ToString();中國古代數(shù)學(xué)家張秋儉,在他的計算中提出了著名的“百元買百只雞”的問題:雞翁一只,值五,雞媽媽一只,值三,雞小雞三只,值一,用一百元買百只雞,問翁、媽媽和小雞什么幾何?程序列出了所有可能的雞肉購買計劃。讓雞翁、雞媽媽和雞小雞分別是x、y和z。根據(jù)題目的要求,方程如下:x y z=100 5x 3y z/3=100,三個未知數(shù)和兩個方程。這個問題有幾種解決方法。為了解決這些問題,我們采用了“試錯法”,并且考慮了各種情況。

8、三個未知數(shù)通過三重循環(huán)實現(xiàn)。示例6:窮舉方法:用100美元買100只雞,16,私有無效按鈕1 _ click(對象發(fā)送者,eventargs e)為(int x=0;x=100X) /雞翁x為(int y=0;y=100Y) /雞媽媽y為(int z=0;z=100Z=3) /奇克z如果(x y z=100),17,示例7:零錢的窮舉方法,將一角硬幣換成零錢(包括任意數(shù)量的面值,包括1美分、2美分和5美分)。有多少種方法?組成一角硬幣的零錢有十個1美分、五個2美分和兩個5美分。判斷所有組合的總和正好是一個角(10分)的多少倍是你想要的。18,私有無效按鈕1_Click(對象發(fā)送者,事件參數(shù)e)

9、為(int x=0;x=10X) /1分鐘數(shù)為(int y=0;y=5;Y) /2分鐘(int z=0;z=2;Z) /5分鐘,如果(x y*2 z*5=10)文本框1。文本=方案一分鐘數(shù)字: x.ToString()兩分鐘數(shù)字: y.ToString()五分鐘數(shù)字3360z。tostring()rn;貪婪算法,這是一種更簡單、更快速的解決一些優(yōu)化問題的設(shè)計技術(shù)。其特點是循序漸進,經(jīng)常根據(jù)當(dāng)前情況,根據(jù)一定的優(yōu)化措施做出最佳選擇,而不考慮所有可能的全局情況,與窮舉相比節(jié)省了時間。它采用自頂向下的迭代方法進行連續(xù)的貪婪選擇。每一個貪婪的選擇都將問題簡化為一個更小的子問題,通過每一個貪婪的選擇,都

10、可以得到一個最優(yōu)解。20,例8:貪婪算法找零,一個孩子用一美元買了不到一美元的糖,售貨員想給孩子最小的硬幣。(硬幣的面值是25美分、10美分、5美分和1美分。),銷售員一步一步地補上零錢,一次加一枚硬幣。在硬幣選擇中使用的貪婪標(biāo)準(zhǔn)如下:在每次選擇中應(yīng)該盡可能地增加零錢的數(shù)量,但是所選硬幣的總和不應(yīng)該超過零錢的總量。21,私人空間按鈕1 _點擊(對象發(fā)送者,事件)文本框2。文本=;int m=25,10,5,1;/硬幣面額int n=convert . toint 16(text box 1 . text);/查找零數(shù)字int num=新intm。長度;/硬幣式陣列數(shù)=趙(m,n);/為(int

11、 I=0;長度;I)文本框2。文本=numi mi面值;公共靜態(tài)整數(shù)(整數(shù)m,整數(shù)n)整數(shù)k=m長度;int num=新intk對于(int I=0;I k;I)numi=n/mi;/模塊和硬幣數(shù)量n=n % mi/余數(shù)返回數(shù);迭代方法,也稱為旋轉(zhuǎn)方法,是從變量的舊值中遞歸出新值的過程。迭代算法是計算機解決問題的基本方法。利用計算機運算速度快、適合重復(fù)運算的特點,計算機可以重復(fù)執(zhí)行一組指令,每次執(zhí)行這組指令時,都會從其原始值中導(dǎo)出一個新的變量值。典型的應(yīng)用是求高階方程的根:牛頓迭代法與二元迭代法,23,1)用二元迭代法求高階方程的根,用二元迭代法求一元高階方程的解。步驟:找到y(tǒng)=f(x)的根單

12、調(diào)區(qū)間x1,x2;選擇區(qū)間中點x3=(x1 x2)/2,如f (x1) * f (x3)0,表示根在x1和x3,且x2=x3否則在x3,x2,x1=x3上述操作在根區(qū)間內(nèi)繼續(xù)進行。當(dāng)剩余區(qū)間|x2-x1|足夠小時(滿足給定精度),區(qū)間的中點被認(rèn)為是該方法的數(shù)值解。24,例9:用二進制迭代法求高階方程的根,x3-x-1=0是區(qū)間0,2(精度e=10-6)中的數(shù)值解,private void button 1 _ click(object sender,eventargs e) double x1=0,x2=2,x3=0;(x2-x1 0.0000001)/判斷是否滿足精度要求x3=(x1 x2)

13、/2;如果(x1 * x1 * x1-x1-1)*(x3 * x3 * x3-x3-1)0)x2=x3;否則x1=x3/更改間隔文本框1。文本=x3。ToString();25,牛頓迭代法(弦切法)迭代公式:給出一個初始值x1作為方程的近似根,用迭代公式得到x1,如果x2是近似根,否則x1=x2,用迭代公式得到一個新的x2。2)牛頓迭代法求高階方程的根,26,例10:牛頓迭代法求高階方程的根,x3-x 1=0近2,私有空按鈕1 _ click(對象發(fā)送者,事件變量e)int I=0;/迭代次數(shù)加倍x1=0,x2=2;而(數(shù)學(xué)。Abs(x2 - x1 ) 0.0001) x1=x2。/迭代公式x2=x1-(x1 * x1 * x1-x1-1)/(3 * x1 * x1-1);我;文本框1。文本=x2。ToString();文本框2。文本=I . ToString();27,6,數(shù)值積分,大多數(shù)函數(shù)f找不到它原來的函數(shù)f,計算機可以對它的數(shù)值解進行編程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論