Google资深工程师深度讲解Go语言-函数式编程(六)

举报
lxw1844912514 发表于 2022/03/26 23:33:29 2022/03/26
【摘要】 一.函数式编程 1.函数与闭包 函数式编程vc函数指针 函数是一等公民:参数,边临,返回值都可以是函数高阶函数函数->闭包 "正统"函数式编程 不可变性:不能有状态,只有常量和函数函数只能有一个参数 package main import "fmt" func adder() func(int) int { sum :...

一.函数式编程

1.函数与闭包

函数式编程vc函数指针

  • 函数是一等公民:参数,边临,返回值都可以是函数
  • 高阶函数
  • 函数->闭包

"正统"函数式编程

  • 不可变性:不能有状态,只有常量和函数
  • 函数只能有一个参数


  
  1. package main
  2. import "fmt"
  3. func adder() func(int) int {
  4. sum := 0
  5. return func(v int) int {
  6. sum += v
  7. return sum
  8. }
  9. }
  10. func main() {
  11. a := adder()
  12. for i := 0; i < 10; i++ {
  13. fmt.Printf("0+1+...%d=%d\n",i,a(i))
  14. }
  15. }

  
  1. package main
  2. import "fmt"
  3. func adder() func(int) int {
  4. sum := 0
  5. return func(v int) int {
  6. sum += v
  7. return sum
  8. }
  9. }
  10. /**
  11. 正统
  12. */
  13. type iAdder func(int) (int, iAdder)
  14. func adder2(base int) iAdder {
  15. return func(v int) (int, iAdder) {
  16. return base + v, adder2(base + v)
  17. }
  18. }
  19. func main() {
  20. a := adder2(0)
  21. for i := 0; i < 9; i++ {
  22. var s int
  23. s, a = a(i)
  24. fmt.Printf("0+1+...%d=%d\n", i, s)
  25. }
  26. }

2.闭包的应用

  • 更为自然,不需要修饰如何访问自由变量
  • 没有lambda表达式,但是有匿名函数

扩展:

二叉树遍历(前序、中序、后序、层次遍历、深度优先、广度优先)

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁,而对于广度遍历来说,需要其他数据结构的支撑,比如堆了。所以,对于一段代码来说,可读性有时候要比代码本身的效率要重要的多。

四种主要的遍历思想为:

前序遍历:根结点 ---> 左子树 ---> 右子树

中序遍历:左子树---> 根结点 ---> 右子树

后序遍历:左子树 ---> 右子树 ---> 根结点

层次遍历:只需按层次遍历即可

例如,求下面二叉树的各种遍历

 

前序遍历:1  2  4  5  7  8  3  6 

中序遍历:4  2  7  5  8  1  3  6

后序遍历:4  7  8  5  2  6  3  1

层次遍历:1  2  3  4  5  6  7  8

 

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/108267907

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。