回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,10 +1,10 @@
## 5.2. 遞歸
## 5.2. 递归
可以是遞歸的,意味着函可以直接或接的調用自身。對許多問題而言,遞歸是一種強有力的技,例如處理遞歸的數據結構。在4.4,我們通過遍歷二叉樹來實現簡單的插入排序,在本章,我再次使用它來處理HTML文件。
可以是递归的,意味着函可以直接或接的用自身。对许多问题而言,递归是一种强有力的技,例如处理递归的数据结构。在4.4,我们通过遍历二叉树来实现简单的插入排序,在本章,我再次使用它来处理HTML文件。
下文的示例代使用了非標準包 golang.org/x/net/html 解析HTML。golang.org/x/... 目下存了一些由Go糰隊設計、維護,對網絡編程、国化文件理、移平台、圖像處理、加密解密、開發者工具提供支持的展包。未將這些擴展包加入到標準庫原因有二,一是部分包仍在開發中,二是大多Go言的開發者而言,展包提供的功能很少被使用。
下文的示例代使用了非标准包 golang.org/x/net/html 解析HTML。golang.org/x/... 目下存了一些由Go团队设计、维护,对网络编程、国化文件理、移平台、图像处理、加密解密、开发者工具提供支持的展包。未将这些扩展包加入到标准库原因有二,一是部分包仍在开发中,二是大多Go言的开发者而言,展包提供的功能很少被使用。
例子中調用golang.org/x/net/html的部分api如下所示。html.Parse函數讀入一bytes.解析,返html.node型的HTML頁面樹狀結構根節點。HTML有很多型的結點如text文本,commnets註釋)類型,在下面的例子中,我們 隻關註< name key='value' >形式的結點
例子中用golang.org/x/net/html的部分api如下所示。html.Parse函数读入一bytes.解析,返html.node型的HTML页面树状结构根节点。HTML有很多型的结点如text文本,commnets注释)类型,在下面的例子中,我们 只关注< name key='value' >形式的结点
<u><i>golang.org/x/net/html</i></u>
```Go
@@ -35,7 +35,7 @@ type Attribute struct {
func Parse(r io.Reader) (*Node, error)
```
main函解析HTML標準輸入,通過遞歸函數visit得links接),打印出些links
main函解析HTML标准输入,通过递归函数visit得links接),打印出些links
<u></i>gopl.io/ch5/findlinks1</i></u>
```Go
@@ -61,7 +61,7 @@ func main() {
}
```
visit函數遍歷HTML的節點樹,從每一anchor元素的href屬性獲得link,將這些links存入字符串數組中,併返迴這個字符串數組
visit函数遍历HTML的节点树,从每一anchor元素的href属性获得link,将这些links存入字符串数组中,并返回这个字符串数组
```Go
// visit appends to links each link found in n and returns the result.
@@ -80,9 +80,9 @@ func visit(links []string, n *html.Node) []string {
}
```
了遍歷結點n的所有後代結點每次遇到n的孩子結點時visit遞歸的調用自身。些孩子結點存放在FirstChild表中。
了遍历结点n的所有后代结点每次遇到n的孩子结点时visit递归的调用自身。些孩子结点存放在FirstChild表中。
讓我們以Go的主golang.org爲目標,運行findlinks。我以fetch1.5章)的出作findlinks的入。下面的出做了簡化處理。
让我们以Go的主golang.org为目标,运行findlinks。我以fetch1.5章)的出作findlinks的入。下面的出做了简化处理。
```
$ go build gopl.io/ch1/fetch
@@ -102,9 +102,9 @@ https://golang.org/dl/
http://www.google.com/intl/en/policies/privacy/
```
意在面中出現的鏈接格式,在之後我們會介紹如何將這些鏈接,根根路 https://golang.org )生成可以直接訪問的url。
意在面中出现的链接格式,在之后我们会介绍如何将这些链接,根根路 https://golang.org )生成可以直接访问的url。
在函outline中們通過遞歸的方式遍歷整個HTML結點樹,併輸出樹的結構。在outline部,每遇到一HTML元素標籤,就其入棧,併輸出。
在函outline中们通过递归的方式遍历整个HTML结点树,并输出树的结构。在outline部,每遇到一HTML元素标签,就其入栈,并输出。
<u><i>gopl.io/ch5/outline</i></u>
```Go
@@ -127,9 +127,9 @@ func outline(stack []string, n *html.Node) {
}
```
有一值得outline有入操作,但有相對應的出操作。outline調用自身,被調用者接收的是stack的拷。被調用者的入操作,改的是stack的拷,而不是調用者的stack,因對當函數返迴時,調用者的stack未被改。
有一值得outline有入操作,但有相对应的出操作。outline用自身,被用者接收的是stack的拷。被用者的入操作,改的是stack的拷,而不是用者的stack,因对当函数返回时,调用者的stack未被改。
下面是 https://golang.org 面的簡要結構:
下面是 https://golang.org 面的简要结构:
```
$ go build gopl.io/ch5/outline
@@ -149,14 +149,14 @@ $ ./fetch https://golang.org | ./outline
...
```
正如你在上面實驗中所大部分HTML頁面隻需幾層遞歸就能被理,但仍然有些面需要深次的遞歸
正如你在上面实验中所大部分HTML页面只需几层递归就能被理,但仍然有些面需要深次的递归
大部分編程語言使用固定大小的函數調用棧,常的大小64KB到2MB不等。固定大小棧會限製遞歸的深度,你用遞歸處理大量數據時,需要避免溢出;除此之外,還會導致安全性問題。與相反,Go言使用可變棧,棧的大小按需增加(初始很小)。使得我使用遞歸時不必考溢出和安全問題
大部分编程语言使用固定大小的函数调用栈,常的大小64KB到2MB不等。固定大小栈会限制递归的深度,你用递归处理大量数据时,需要避免溢出;除此之外,还会导致安全性问题。与相反,Go言使用可变栈,栈的大小按需增加(初始很小)。使得我使用递归时不必考溢出和安全问题
**練習 5.1** 改findlinks代中遍n.FirstChild表的部分,將循環調用visit改成遞歸調用。
**练习 5.1** 改findlinks代中遍n.FirstChild表的部分,将循环调用visit改成递归调用。
**練習 5.2** 編寫函數,記録在HTML中出的同名元素的次
**练习 5.2** 编写函数,记录在HTML中出的同名元素的次
**練習 5.3** 編寫函數輸出所有text結點的內容。意不要訪問`<script>``<style>`元素,因爲這些元素對瀏覽者是不可的。
**练习 5.3** 编写函数输出所有text结点的内容。意不要访问`<script>``<style>`元素,因为这些元素对浏览者是不可的。
**練習 5.4** 展vist函,使其能夠處理其他型的結點如images、scripts和style sheets。
**练习 5.4** 展vist函,使其能够处理其他型的结点如images、scripts和style sheets。