[日常] Go语言圣经-函数递归习题
2023-02-18 15:41:36 时间
练习 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 main import ( "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结点的内容。注意不要访问<script>和<style>元素,因为这些元素对浏览者是不可见的。 */ func visit3(texts []string, n *html.Node) []string { if n.Type == html.TextNode { texts = append(texts, n.Data) } for c := n.FirstChild; c != nil; c = c.NextSibling { if c.Data == "script" || c.Data == "style" { continue } texts = visit3(texts, c) } return texts } /* 练习 5.4: 扩展visit函数,使其能够处理其他类型的结点,如images、scripts和style sheets。 */ func visit4(links []string, n *html.Node) []string { if n.Type == html.ElementNode && (n.Data == "a" || n.Data == "img" || n.Data == "link" || n.Data == "scripts") { for _, a := range n.Attr { if a.Key == "href" { links = append(links, a.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { links = visit4(links, c) } return links }
相关文章
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023
- Mac OSX 安装 MongoDB
- Kali Linux 在VMware Workstation Pro上的安装