欢迎使用CSDN-markdown编辑器
来源:互联网 发布:以前网络歌手名单大全 编辑:程序博客网 时间:2024/06/04 01:20
函数式编程
- 函数式编程
- 概念
- - 语言支持举例
- - 举个栗子
- - 特点
- - 优点
- 三个常用函数
- - filter
- - map flatmap
- - reduce
- 概念
概念
一种编程范式,属于「结构化编程」的一种。强调执行的==结果==而不是执行的过程
- 语言支持举例
- 支持良好:swift、JavaScript、Python
- 支持不好:C/C++(C++11以前)、Obj-C(引入 block 以前)、JAVA(8以前)
- 举个栗子
//过程式 var a = 0 func incrementUnfunctional() -> () { a += 1 } incrementUnfunctional() print(a) // a = 1 //函数式 var a = 0 func incrementFunctional(num: Int) -> Int { return num + 1 } a = incrementFunctional(a) print(a) // a = 1
- 特点
函数是第一等公民(Frist Class), 支持闭包或者其他值捕获写法
var print = function(i) { console.log(i); }; [1, 2, 3].forEach(print)
- 使用「表达式」而不是「语句」
- 表达式:有返回值的一个单纯运算过程
- 语句:执行操作,没有返回值
- 没有副作用,即函数不产生运算以外的其他结果
不修改状态
function reverse(string) { if (string.length == 0) { return string; } else { return reverse(string.substring(1, string.length)) + string.substring(0, 1); }}var str = "Hello, world!";console.log(reverse(str));// !dllow, ollehconsole.log(str);// Hello, world!
- 引用透明,即可再现性
- 优点
减少代码冗余
接近自然语言
subtract(multiply(add(1, 2), 2), 4);add(1, 2).multiply(3).subtract(4);merge([1, 2], [3, 4]).sort().search("2")
方便测试和查错
易于并发编程
var s1 = op1();var s2 = op2()lvar s3 = concat(s1, s2);//函数式编程要求保证 op1 不修改变量或系统状态,即 op2 可能用到的状态不会被 op1 修改
三个常用函数
- filter()
用途:[x~1~, x~2~, …, x~n~] -> if (f(x~n~) == true -> [f(x~n1~), f(x~n2~), …]
参数:1.一个集合 2. 一个函数
操作步骤:
- 生成一个空集合
- 对集合中的每个元素执行函数
- 返回值为 true -> 放进新集合,否则丢弃
- 返回新的集合
//swiftvar arr = [10, 20, 45, 32, 100]var filteredArray = arr.filter({(money: Int) -> Bool in return money > 30})print(filteredArray)
//JavaScriptvar filteredArray = arr.filter(function (m) { return m > 30})console.log(filteredArray)
- map() / flatmap()
用途:[x~1~, x~2~,… x~n~] -> [f(x~1~), f(x~2~), … f(x~n~)]
参数:1. 一个集合 2. 一个函数
操作步骤:
- 生成一个空集合
- 用函数处理传入集合中的每一个元素,依次插入新集合
- 返回新的集合
//swiftvar mappedArray = arr.map{ money in return "\(money)¥"}print(mappedArray)func sqr(x: Int) -> Int{ return x * x}let squares = [0, 1, 2, 3, 4].map(sqr)print(squares) // [0, 1, 4, 9, 16]
//JavaScriptvar mappedArray = arr.map(function (m) { return m + "$"})console.log(mappedArray)
- reduce()
用途:[x~1~, x~2~, … x~n~] -> [f(f…f(f(x~1~, x~2~), x~3~)…, x~n-1~), x~n~)]
参数:1. 一个集合 2. 一个函数(JS 中最多接受四个参数)3.一个初值(JS 中可不写)
操作步骤:(假设集合中有 m 个元素,函数 f 接受 n 个参数,返回一个 Int,初值为0)
- 集合中的前 n-1 个元素和 0 作为参数执行函数 f,获得返回值 r1
- 集合中的第 1~n 个元素和 r1 作为参数执行函数 f,获得返回值 r2
- …
- 集合中的第 m-n+1 个元素和 r~n-1~ 作为参数执行函数 f,获得返回值 r
- r 就是 reduce 方法的返回值
//swiftlet sum = [10, 20, 45, 32, 100].reduce(0) { $0 + $1 }print(sum)
//JavaScriptvar reducedArray = [10, 20, 45, 32, 100].reduce(function (m1, m2) { return m1 + m2})console.log(reducedArray)
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- Joomla 数据操作 getDbo
- ahu-563-3次幂分解
- angular中 modal模态框(可复用)
- 出现随机数字及添加、排序数据
- 算法笔记0005——【分治法】快速排序
- 欢迎使用CSDN-markdown编辑器
- js中document对象使用
- 百度、腾讯和阿里内部的级别和薪资待遇(2014)
- JavaScript对象
- 对目前团队的意见和对项目需求的分析
- 谈谈 Python 程序的运行原理
- springmvc(3)
- AFNetworking 新版本3.0的迁移
- leetcode_079 Word Search