博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[日常] Go语言圣经-函数递归习题
阅读量:6983 次
发布时间:2019-06-27

本文共 2257 字,大约阅读时间需要 7 分钟。

练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用。

练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数。

练习 5.3: 编写函数输出所有text结点的内容。注意不要访问<script>和<style>元素,因为这些元素对浏览者是不可见的。

练习 5.4: 扩展visit函数,使其能够处理其他类型的结点,如images、scripts和style sheets。

// Findlinks1 prints the links in an HTML document read from standard input.package mainimport (        "fmt"        "os"        "golang.org/x/net/html")func main() {        doc, err := html.Parse(os.Stdin)        if err != nil {                fmt.Fprintf(os.Stderr, "findlinks1: %v\n", err)                os.Exit(1)        }        for _, link := range visit(nil, doc) {                fmt.Println(link)        }        var res = make(map[string]int)        res = count(res, doc)        for k, v := range res {                fmt.Printf("%s==>%d \n", k, v)        }        //fmt.Println(res)        for _, text := range visit3(nil, doc) {                fmt.Println(text)        }        for _, link := range visit4(nil, doc) {                fmt.Println(link)        }}// visit appends to links each link found in n and returns the result.func visit(links []string, n *html.Node) []string {        if n.Type == html.ElementNode && n.Data == "a" {                for _, a := range n.Attr {                        if a.Key == "href" {                                links = append(links, a.Val)                        }                }        }        /*           练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用。           实在是不知道为啥不对,我选择放弃                if n.FirstChild!=nil{                        links=visit(links,n.FirstChild)                }else if n.NextSibling!=nil{                        //n=n.NextSibling                        links=visit(links,n.NextSibling)                }        */        for c := n.FirstChild; c != nil; c = c.NextSibling {                links = visit(links, c)        }        return links}/*练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数。*/func count(res map[string]int, n *html.Node) map[string]int {        if n.Type == html.ElementNode {                res[n.Data]++        }        for c := n.FirstChild; c != nil; c = c.NextSibling {                res = count(res, c)        }        return res}/*练习 5.3: 编写函数输出所有text结点的内容。注意不要访问

  

转载于:https://www.cnblogs.com/taoshihan/p/8825132.html

你可能感兴趣的文章
Spring Cloud微服务分布式云架构—集成项目简介
查看>>
SQLServer之删除存储过程
查看>>
盒马鲜生颠覆传统生鲜市场的胜算几何?
查看>>
“无人化时代”正在逼近,网友:再不努力就无工可打啦!
查看>>
【Node】常用基础 API 整理
查看>>
传神成进博会唯一指定智能翻译硬件提供商 力助无障碍沟通
查看>>
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
查看>>
Java程序员须知:分布式微服务为什么很难?
查看>>
SQLServer之创建唯一聚集索引
查看>>
好程序员web前端技术之CSS3过渡
查看>>
java B2B2C源码电子商务平台 - Zuul回退机制
查看>>
记录Docker in Docker 安装(CentOS7)
查看>>
简单的写一个发布订阅器
查看>>
重学前端-js的类型问题
查看>>
Function类型
查看>>
Python学习
查看>>
你有多渴望赚钱
查看>>
ES6之let和const
查看>>
关于跨域
查看>>
一个半路出家的前端工程师的2018 | 掘金年度征文
查看>>