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

首頁 > 編程 > C# > 正文

C#遞歸算法之分而治之策略

2020-01-24 01:06:18
字體:
供稿:網(wǎng)友

1.分而治之的概念    

  分而治之是一種使用遞歸解決問題的算法,主要的技巧是將一個(gè)大的復(fù)雜的問題劃分為多個(gè)子問題,而這些子問題可以作為終止條件,或者在一個(gè)遞歸步驟中得到解決,所有子問題的解決結(jié)合起來就構(gòu)成了對原問題的解決

2.分而治之的優(yōu)點(diǎn)和缺點(diǎn)

  分而治之算法通常包括一個(gè)或者多個(gè)遞歸方法的調(diào)用,當(dāng)這些調(diào)用將數(shù)據(jù)分隔成為獨(dú)立的集合從而處理較小集合的時(shí)候,分而治之的策略將會有很高的效率,而在數(shù)據(jù)進(jìn)行分解的時(shí)候,分而治之的策略可能會產(chǎn)生大量的重復(fù)計(jì)算,從而導(dǎo)致性能的降低。

3.畫標(biāo)尺程序的分析講解

  畫標(biāo)尺是分而治之的策略的一個(gè)簡單應(yīng)用,標(biāo)尺是由長度為1英寸的單元構(gòu)成的序列,每個(gè)單元的末端有最長的記號,每個(gè)寸單元的1/2英寸處的記號要比末端的短,在1/4處的記號比1/2的要短,1/8處比1/4處短,編寫一個(gè)程序,在一條線上,用規(guī)則間隔來繪制標(biāo)記,在特定位置有特定大小的記號。

  分析:在一個(gè)直線上,我們可以首先將這條直線一分為二,然后對分出來的二個(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,對應(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

  用圖示可以表示如下

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

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

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

  我們可以將連續(xù)第歸產(chǎn)生的記號看作二叉樹的節(jié)點(diǎn)。樹根h為初值。就是1/2處的記號,每個(gè)父記號都產(chǎn)生了兩個(gè)子記號。如下圖所示

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

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.VeVB.COm/201606/yuanma/DrawRuler(VeVB.COm).rar

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 禄丰县| 江口县| 邵东县| 图木舒克市| 深州市| 花莲市| 扎鲁特旗| 周至县| 上杭县| 文昌市| 小金县| 盐山县| 海口市| 白水县| 新民市| 宜都市| 油尖旺区| 德化县| 二手房| 城市| 铜梁县| 嘉鱼县| 东兰县| 固镇县| 恩施市| 香河县| 格尔木市| 南溪县| 肃北| 即墨市| 台南市| 兴国县| 五寨县| 临清市| 都兰县| 兴隆县| 蛟河市| 连山| 西畴县| 岳阳县| 凤山市|