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

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

大家好,又见面了,我是全栈君。

一.函数式编程

1.函数与闭包

函数式编程vc函数指针

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

“正统”函数式编程

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

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

package main

import "fmt"

func adder() func(int) int {
	sum := 0
	return func(v int) int {
		sum += v
		return sum
	}
}

func main() {
	a := adder()
	for i := 0; i < 10; i++ {
		fmt.Printf("0+1+...%d=%d\n",i,a(i))
	}
}
package main

import "fmt"

func adder() func(int) int {
	sum := 0
	return func(v int) int {
		sum += v
		return sum
	}
}

/**
正统
*/
type iAdder func(int) (int, iAdder)

func adder2(base int) iAdder {
	return func(v int) (int, iAdder) {
		return base + v, adder2(base + v)
	}
}

func main() {
	a := adder2(0)
	for i := 0; i < 9; i++ {
		var s int
		s, a = a(i)
		fmt.Printf("0+1+...%d=%d\n", i, s)
	}
}

2.闭包的应用

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

扩展:

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

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

四种主要的遍历思想为:

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

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

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

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

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

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

 

前序遍历: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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111711.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • MyEclipse6.5安装SVN插件的三种方法 .

    MyEclipse6.5安装SVN插件的三种方法 .一、安装方法:方法一、如果可以上网可在线安装1.打开Myeclipse,在菜单栏中选择Help→SoftwareUpdates→FindandInstall;2.选择Searchfornewfeaturestoinstall,点击Next进入下一步;3.点击”NewRemoteSite”按钮,在弹出的对话框中输入:name:SVN

    2022年7月20日
  • MySQL slave状态之Seconds_Behind_Master

    MySQL slave状态之Seconds_Behind_Master

    2021年11月28日
  • Eurake和Zookeeper的区别

    Eurake和Zookeeper的区别拉取方式zookeeper通知消费者来拿Eurake是定时去拿集群方式zookeeper分主从eureka没有主从之分设计角度不同capc 一致性 a 可用性 p 分区容错区 如果zookeeper的主集群挂掉之后那么整个zookeeper的集群就无法对外提供服务,大多数情况可以容忍一段时间的脏数据但是不能接收整个注册中心无法对外提供服务。所以在设计时zookeeper强调cp(c在官网的解释是一致性,底层有一个queu…

    2022年5月27日
  • Java Array、List、Set互相转化

    Java Array、List、Set互相转化JavaArrayListSet互相转化ArrayListSet互转实例1ArrayList互转2ListSet互转3ArraySet互转ArraysasList和CollectiontoArrayJavaArray、List、Set互相转化1.Array、List、Set互转实例1.1Array、List互转Array转ListString[]s=newSt

    2022年6月21日
  • Ubuntu安装GCC5/7/9/10/11「建议收藏」

    Ubuntu安装GCC5/7/9/10/11「建议收藏」为了使用C++14/17的新特性,我们难免要升级下自己的GCC版本,同时还要保证自己新安装的GCC生效,并且和原GCC共存。安装GCC-5.0sudoadd-apt-repositoryppa:ubuntu-toolchain-r/testsudoapt-getupdatesudoapt-getinstallgcc-5g++-5sudoupdate-alte…

    2022年7月24日
  • C++ vector 初始化大小[通俗易懂]

    C++ vector 初始化大小[通俗易懂]一维数组使用下面的代码可以初始化一个大小为n的一维数组vector<int>dp(n);二维数组使用下面的代码可以初始化一个row行col列的二维数组vector<vector<int>>dp(row,vector<int>(col));三维数组使用下面的代码可以初始化一个三维数组,维度分别为n1,n2,n3vector<vector<vector<int>>>dp(n1,vector&

    2022年9月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号