C#遞歸算法之分而治之策略
1.分而治之的概念
分而治之是一種使用遞歸解決問題的算法,主要的技巧是將一個(gè)大的復(fù)雜的問題劃分為多個(gè)子問題,而這些子問題可以作為終止條件,或者在一個(gè)遞歸步驟中得到解決,所有子問題的解決結(jié)合起來(lái)就構(gòu)成了對(duì)原問題的解決
2.分而治之的優(yōu)點(diǎn)和缺點(diǎn)
分而治之算法通常包括一個(gè)或者多個(gè)遞歸方法的調(diào)用,當(dāng)這些調(diào)用將數(shù)據(jù)分隔成為獨(dú)立的集合從而處理較小集合的時(shí)候,分而治之的策略將會(huì)有很高的效率,而在數(shù)據(jù)進(jìn)行分解的時(shí)候,分而治之的策略可能會(huì)產(chǎn)生大量的重復(fù)計(jì)算,從而導(dǎo)致性能的降低。
3.畫標(biāo)尺程序的分析講解
畫標(biāo)尺是分而治之的策略的一個(gè)簡(jiǎn)單應(yīng)用,標(biāo)尺是由長(zhǎng)度為1英寸的單元構(gòu)成的序列,每個(gè)單元的末端有最長(zhǎng)的記號(hào),每個(gè)寸單元的1/2英寸處的記號(hào)要比末端的短,在1/4處的記號(hào)比1/2的要短,1/8處比1/4處短,編寫一個(gè)程序,在一條線上,用規(guī)則間隔來(lái)繪制標(biāo)記,在特定位置有特定大小的記號(hào)。
分析:在一個(gè)直線上,我們可以首先將這條直線一分為二,然后對(duì)分出來(lái)的二個(gè)再進(jìn)行拆分。直到滿足一定的精度要求,比如以最小刻度為1/8英寸為例,drawRuler作為畫標(biāo)尺的第歸函數(shù),在drawRuler函數(shù)中用一段線段的兩端(起點(diǎn)(startPos),終點(diǎn)(endPos)),和變量h作為參數(shù),標(biāo)記的基礎(chǔ)高度為baseHeight,而標(biāo)記的高度應(yīng)該為h*baseHeight,則標(biāo)尺的畫法可以分析如下:
計(jì)算間隔(0.0,1.0)的中點(diǎn):midPos = (startPost+endPos)/2;在中點(diǎn)1/2處畫一個(gè)標(biāo)記,高度為3*baseHeight
將中點(diǎn)分隔開的為兩條直線,再使用第歸函數(shù)drawRule,對(duì)應(yīng)的起點(diǎn),終點(diǎn)為(0.0,0.5)和(0.5,1.0),參數(shù)h-1,這樣可以使高度相比短些
第歸步驟2(h=2)
midPos = (0.0+0.5)/2 (1/4處),高度為 2*baseHeight
midPos = (0.5+1.0)/2 (3/4處)高度為 2*baseHeight
第歸步驟(h=1)
分別在1/8處和7/8處標(biāo)記,計(jì)算方法
midPos = (0.0+0.25)/2 (1/8) 高度為baseHeight
midPos = (0.75+1)/2 (7/8) 高度為baseHeight
用圖示可以表示如下
我們可以將連續(xù)第歸產(chǎn)生的記號(hào)看作二叉樹的節(jié)點(diǎn)。樹根h為初值。就是1/2處的記號(hào),每個(gè)父記號(hào)都產(chǎn)生了兩個(gè)子記號(hào)。如下圖所示
4.可執(zhí)行程序文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace DrawRuler { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } void drawRuler(float startPos, float endPos, int h) { float baseHeight =4; if (h > 0) { float midPos = (startPos + endPos) / 2; float height = h * baseHeight; drawMark(midPos, height); drawRuler(startPos, midPos, h - 1); drawRuler(midPos, endPos, h - 1); } } void drawMark(float pos, float height) { using (Graphics g = this.CreateGraphics()) { float xOffset = 100 + pos; float yOffset = 100-height; SolidBrush brusuh = new SolidBrush(Color.Black); Pen p = new Pen(brusuh, 1); g.DrawLine(p, xOffset, yOffset, xOffset, 100); } } private void Form1_Paint(object sender, PaintEventArgs e) { #region 首先畫一條直線 using (Graphics g = e.Graphics) { float xOffset = 100; float yOffset = 100; int len = 300; SolidBrush brusuh = new SolidBrush(Color.Black); Pen p = new Pen(brusuh, 2); g.DrawLine(p, xOffset, yOffset, xOffset + len, yOffset); } #endregion drawRuler(0, 300, 3); } } }
5.代碼下載
http://xiazai.jb51.net/201606/yuanma/DrawRuler(jb51.net).rar
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:淺談C#中的值類型和引用類型
欄 目:C#教程
下一篇:FTPClientHelper輔助類 實(shí)現(xiàn)文件上傳,目錄操作,下載等操作
本文標(biāo)題:C#遞歸算法之分而治之策略
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6427.html
您可能感興趣的文章
- 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é)之流程控制語(yǔ)句
- 01-10C#基于委托實(shí)現(xiàn)多線程之間操作的方法


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