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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 在pycharm中配置Anaconda以及pip源配置

    在pycharm中配置Anaconda以及pip源配置在学习推荐系统、机器学习、数据挖掘时,python是非常强大的工具,也有很多很强大的模块,但是模块的安装却是一件令人头疼的事情。现在有个工具——anaconda,他已经帮我们集成好了很多工具了!anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便,而python是一个编译器,如果不使用anaconda,那么安装起来会比较痛苦,各个库之间的依赖性就很难连接的很好。在wind

    2022年5月15日
  • 二进制、八进制、十进制、十六进制之间的转换

    二进制、八进制、十进制、十六进制之间的转换二进制、八进制、十进制、十六进制之间的转换

    2022年4月25日
  • 使用 Preload&Prefetch 优化前端页面的资源加载「建议收藏」

    使用 Preload&Prefetch 优化前端页面的资源加载「建议收藏」对于前端页面来说,静态资源的加载对页面性能起着至关重要的作用。本文将介绍浏览器提供的两个资源指令-preload/prefetch,它们能够辅助浏览器优化资源加载的顺序和时机,提升页面性能。一、从一个实例开始如上图所示,我们开发了一个简单的收银台,支付过程中可以展开优惠券列表选择相应的券。从动图可以看到,列表第一次展开时,优惠券背景有一个逐渐显示的过程,体验上不是很好。问题的原因也很明显,由于背景使用了视觉特意设计的图片,优惠券列表展开时需要去加载图片,背景渐显的过程实际上就是图片加载的过程

    2022年10月30日
  • 决策树:什么是基尼系数(“杂质 增益 指数 系数”辨析)「建议收藏」

    决策树:什么是基尼系数(“杂质 增益 指数 系数”辨析)「建议收藏」决策树:什么是基尼系数在我翻译学习这篇RandomForestsforCompleteBeginners的时候,对基尼系数和它相关的一些中文表达充满了疑问,查了一些资料以后,完成了这篇文章。其中基尼杂质系数的计算和解释参考了ASimpleExplanationofGiniImpurity。如果你查看scikit-learn中DecisionTreeClassifier的文…

    2022年10月9日
  • XXE详解

    XXE详解xxe漏洞的学习与利用总结前言对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识。xml基础知识要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许…

    2022年5月10日
  • linux 内网文件传输工具_局域网内文件传输工具 | nitroshare「建议收藏」

    linux 内网文件传输工具_局域网内文件传输工具 | nitroshare「建议收藏」学习计算机网络的朋友们都知道,网络的最重要的一个作用就是实现文件的一个共享,也许你会知道在同一网络上会有多种跨平台的文件共享工具,本文将要向大家介绍的是一款可以在Linux和Windows以及MacOS系统中跨平台的文件共享工具,Nitroshare,它是一款跨平台、开源的应用程序,可以在本地的网络中实现共享文件。NitroShare大大简化了本地网络的文件共享操作,一旦安装上,它就会与操作系统无…

    2022年5月6日

发表回复

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

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