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


相关推荐

  • spring源码剖析(八)spring整合mybatis原理

    spring源码剖析(八)spring整合mybatis原理MyBatis相信很多人都会使用,但是当MyBatis整合到了spring中,我们发现在Spring中使用更加方便了。既然那么方便,Spring到底为我们做了哪些工作呢,它如何将MyBatis整合到Spring中的呢,Spring在整合MyBatis时候做了哪些封装,以及做了哪些拓展,又是怎么实现这些封装以及拓展的,让我们来打开这一部分的源代码,一探究竟。

    2022年5月4日
    60
  • windows开机后一键启动应用程序[通俗易懂]

    一键启动办公软件小工具分享每天上班前打开电脑总有一些固定的软件需要打开(如Foxmail、QQ等),那么一个一个启动非常会比较麻烦,下面分享一下小工具,稍微进行简单的配置后,便可以一键启动你想要打开的软件!

    2022年2月26日
    56
  • mac怎么上传文件到服务器_linux传输文件到linux

    mac怎么上传文件到服务器_linux传输文件到linux前言我们使用mac时,想让本地文件上传至服务器,该怎么办呢windows系统,我们可以使用xftp或者rz命令,那么mac呢?mac系统,我们可以使用sftp、scp或者rz命令,本文介绍sft

    2022年7月28日
    10
  • 开复网好文转载—————-跟踪自己一周

    开复网好文转载—————-跟踪自己一周来源:http://www.5xue.com/modules/bbs/viewthread.php?tid=212302自己跟踪自己一周亲爱的,你是如何喂养你的大脑的呢?如果,你不能每天为你的梦

    2022年6月30日
    26
  • 雷达系统及信号处理_毫米波雷达信号处理

    雷达系统及信号处理_毫米波雷达信号处理雷达,是Radar(RadioDetectionandRanging)的音译,意思是“无线电探测和测距”,它是通过无线电/电磁波的方式获取目标的存在与否以及空间位置,因此雷达也被称为“无线电定位”。发射机向目标发射电磁波,经目标反射之后,由接收机接收,经过信号处理可获得目标至发射机的距离、(径向)速度、方位、高度等信息。能够全天时、全天候工作,穿透能力强,不受光照、雾云雨天气的干扰,因此雷达是非常重要的传感器。……………

    2022年8月30日
    5
  • linux下system函数错误返回-1 错误原因NO child processes

    linux下system函数错误返回-1 错误原因NO child processes调用system函数执行一个shell命令,返回-1,错误提示nochildprocesses但system可以执行成功原因是调用system之前有放置忽略SIGCHLD的语句signal(SIGCHLD,SIG_IGN);如果SIGCHLD信号行为被设置为SIG_IGN时,waitpid()函数有可能因为找不到子进程而报ECHILD错误。似乎我们找到了问题的解决方案:在调用s…

    2022年6月1日
    27

发表回复

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

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