欢迎使用优快云-markdown编辑器

函数式编程

概念

一种编程范式,属于「结构化编程」的一种。强调执行的==结果==而不是执行的过程

- 语言支持举例

  • 支持良好: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

- 特点

  1. 函数是第一等公民(Frist Class), 支持闭包或者其他值捕获写法

       var print = function(i) { console.log(i); };
       [1, 2, 3].forEach(print)
  2. 使用「表达式」而不是「语句」
    • 表达式:有返回值的一个单纯运算过程
    • 语句:执行操作,没有返回值
  3. 没有副作用,即函数不产生运算以外的其他结果
  4. 不修改状态

    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, olleh
    console.log(str);
    // Hello, world!
  5. 引用透明,即可再现性

- 优点

  1. 减少代码冗余

  2. 接近自然语言

    subtract(multiply(add(1, 2), 2), 4);
    add(1, 2).multiply(3).subtract(4);
    
    merge([1, 2], [3, 4]).sort().search("2")
  3. 方便测试和查错

  4. 易于并发编程

    var s1 = op1();
    var s2 = op2()l
    var 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. 一个函数

操作步骤:

  1. 生成一个空集合
  2. 对集合中的每个元素执行函数
  3. 返回值为 true -> 放进新集合,否则丢弃
  4. 返回新的集合
//swift
var arr = [10, 20, 45, 32, 100]

var filteredArray = arr.filter({(money: Int) -> Bool in
    return money > 30
})
print(filteredArray)
//JavaScript
var 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. 一个函数

操作步骤:

  1. 生成一个空集合
  2. 用函数处理传入集合中的每一个元素,依次插入新集合
  3. 返回新的集合
//swift
var 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]
//JavaScript
var 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)

  1. 集合中的前 n-1 个元素和 0 作为参数执行函数 f,获得返回值 r1
  2. 集合中的第 1~n 个元素和 r1 作为参数执行函数 f,获得返回值 r2
  3. 集合中的第 m-n+1 个元素和 r~n-1~ 作为参数执行函数 f,获得返回值 r
  4. r 就是 reduce 方法的返回值
//swift
let sum = [10, 20, 45, 32, 100].reduce(0) { $0 + $1 }
print(sum)
//JavaScript
var reducedArray = [10, 20, 45, 32, 100].reduce(function (m1, m2) {
    return m1 + m2
})
console.log(reducedArray)
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值