day7函数 递归 递归练习题

master
独孤伶俜 2022-12-04 14:20:15 +08:00
parent 5df6dc2c5a
commit f9c06f7b5a
5 changed files with 151 additions and 1 deletions

2
go.mod
View File

@ -1,3 +1,5 @@
module Study
go 1.19
require golang.org/x/net v0.2.0 // indirect

2
go.sum Normal file
View File

@ -0,0 +1,2 @@
golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=

View File

@ -8,7 +8,7 @@ import (
func main() {
http.HandleFunc("/", handler1)
log.Fatal(http.ListenAndServe("localhost:8090", nil))
log.Fatal(http.ListenAndServe("localhost:8989", nil))
}
func handler1(w http.ResponseWriter, r *http.Request) {

View File

@ -0,0 +1,87 @@
package main
import (
"fmt"
"golang.org/x/net/html"
"log"
"net/http"
)
type man struct {
sex bool
name string
action func()
}
func main() {
var dug man
dug.name = "dugulingping"
dug.action = func() {
fmt.Println("Hi " + dug.name)
}
fmt.Printf("%T\n", dug.action)
dug.action()
resp, err := http.Get("https://golang-china.github.io/gopl-zh/ch5/ch5-02.html")
if err != nil {
log.Fatal(err)
}
if resp.StatusCode != http.StatusOK {
err := resp.Body.Close()
if err != nil {
log.Fatal(err)
return
}
}
doc, err := html.Parse(resp.Body)
if err != nil {
log.Fatal(err)
return
}
// 关闭链接
err = resp.Body.Close()
if err != nil {
log.Fatal(err)
return
}
node := make(map[string]int)
v(node, doc)
//fmt.Println(node)
}
func v(node map[string]int, n *html.Node) map[string]int {
if n == nil {
return node
}
if n.Type == html.ElementNode {
node[n.Data] += 1
//fmt.Println(n.Data)
}
if n.Type == html.TextNode {
if n.Data != "script" && n.Data != "style" {
//fmt.Println(n.Data)
}
}
node = v(node, n.FirstChild)
node = v(node, n.NextSibling)
return node
}
func v4(links []string, n *html.Node) []string {
if n == nil {
return links
}
if n.Type == html.ElementNode && (n.Data == "a" || n.Data == "images" || n.Data == "scripts") {
for _, a := range n.Attr {
if a.Key == "href" {
links = append(links, a.Val)
//fmt.Println(a.Val)
}
}
}
links = v4(links, n.FirstChild)
links = v4(links, n.NextSibling)
return links
}

View File

@ -0,0 +1,59 @@
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)
}
//fmt.Println(doc.NextSibling.Data)
for _, link := range visit(nil, doc.FirstChild) {
fmt.Println(link)
}
//outline(nil, doc)
}
// visit appends to links each link found in n and returns the result.
func visit(links []string, n *html.Node) []string {
if n == nil {
return links
}
if n.Type == html.ElementNode && n.Data == "a" {
for _, a := range n.Attr {
if a.Key == "href" {
links = append(links, a.Val)
//fmt.Println(a.Val)
}
}
}
//for c := n.FirstChild; c != nil; c = c.NextSibling {
// links = visit(links, c)
//}
//if n != nil {
// links = visit(links, n.NextSibling)
//}
links = visit(links, n.FirstChild)
links = visit(links, n.NextSibling)
return links
}
func outline(stack []string, n *html.Node) []string {
if n.Type == html.ElementNode {
stack = append(stack, n.Data)
fmt.Println(stack)
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
outline(stack, c)
}
return stack
}