Scheme 4 Javaer-3.高阶函数
1.3 Formulating Abstractions with Higher-Order Procedures
教材有时候依照学生的基础。从0讲起;有时候给出一个大图,然后具体地逐一介绍。
本文或同学们写学习笔记时。要依照后者进行归纳。
函数,是对一些数的复合操作,并且不依赖特定的数。如
(define (cube x) (* x x x))
它不针对某个数如3,而是对全部的參数数据求其立方。
由此。它是对
(* 5 5 5)
(* x x x) ; 这里x为实參
的抽象,而(* 5 5 5)等则编写为函数的应用( cube 5)。
注意,函数cube仅仅是将数作为參数。假设可以将函数作为还有一个函数的參数,会是一种什么场面呢?
函数是第一阶元素
编程语言一般会对其元素的使用方式。做出一些限制。而受到的限制最少的元素属于第一阶(first-class)。
第一阶元素拥有的特权包含:
用变量命名
作为函数的參数
由函数返回
(能够包括在数据结构中)
Java的基本类型和引用类型。都是第一阶元素。可是。函数在Scheme中如同其基本数据类型一样,完全然全地是第一阶元素。
所以,当把函数作为參数、返回值来使用的时候,就有了更高阶的函数。操作函数的函数即为高阶函数。
在数学中。序列求和的sigma (∑)记法/符号,就是一个样例。
无论f(x)是什么。高阶函数∑求和。
假定我们有3个详细的求和函数。
1)sum-integers求代数和(从a到b)
(define (sum-integersa b)
(if (> ab)
0
(+ a(sum-integers (+ a 1) b))))
2)sum-cubes求立方和,
3)pi-sum依照公式
求出л/8.
(define (pi-sum a b)
(if (> ab)
0
(+ (/ 1.0 (* a (+ a 2)))(pi-sum (+ a 4) b))))
如今考虑设计一个高阶函数,表达∑符号。显然,除了參数a。b外,还须要指定∑中的项和变化规律,我们以term描写叙述∑中的项,而next描写叙述依照变化规律得到的下一项。则
(define (sum term next a b) ;我喜欢a、b挨着
(if (> ab)
0
(+(term a)
(sumterm next (next a) b))))
定义的sum为∑求和这一高阶函数。
函数作为參数
高阶函数sum中,term和next都是函数形參,类似C的函数指针。如果我们在sum基础上定义求代数和。就须要提供term和next将要绑定的函数。
代数和的term,是一个恒等函数(identity),next是一个自增函数。
(define (identity x) x)
(define (inc n) (+ n 1))
于是,不须要单独定义sum-integers。而是应用高阶函数sum。得到sum-integers:
(define (sum-integers a b)
(sum identity inc a b))
(sum-integers 1 10)
另外。对于一次性的小函数,使用lambda表达式很紧凑。(在这里不是要点)
函数作为返回
高阶函数sum的返回值是一个数,高阶函数强大之处。能够将某些函数作为输入,而又返回一个函数——函数转换。
(define (transf f)
(lambda(a)(+ a (f a)) ) )
(define (square x)
(* x x) )
((transf square) 2)
函数transf的作用是对函数f进行平移,其返回值是由lambda定义的匿名函数。当将匿名函数应用到2时。得到的是2+f(2)。
函数的參数问题
高阶函数transf处理作为參数的函数f时,将它视为仅仅有一个參数的函数,如函数应用(f a)所暗示的。
可是作为參数的f,并没有说明这一信息。对于两个參数的op
(define (op x y)
(* x y) )
将它应用到transf中是不应该的。解释器对于(transf op)的输出,为什么不是一个错误?当然。进一步应用会出错。
((transf op) 5) ;要2个參数
((transf op) 1 5) ;要一个參数
Scheme 4 Javaer-3.高阶函数的更多相关文章
- 【SICP归纳】2 高阶函数和数据抽象
上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么. 书中展示了非常多有趣的句法(syntax). 如今我们要让思想进一步的抽象.写这篇博客的时候并未学完整本书.更不敢说 ...
- c#语言-高阶函数
介绍 如果说函数是程序中的基本模块,代码段,那高阶函数就是函数的高阶(级)版本,其基本定义如下: 函数自身接受一个或多个函数作为输入. 函数自身能输出一个函数,即函数生产函数. 满足其中一个条件就可以 ...
- swift 的高阶函数的使用代码
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- JavaScript高阶函数
所谓高阶函数(higher-order function) 就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数. 下面的例子接收两个函数f()和g(),并返回一个新的函数用以计算f(g ...
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)
1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...
- Scala的函数,高阶函数,隐式转换
1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...
- Python之路 day3 高阶函数
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...
- JavaScript高阶函数 map reduce filter sort
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 高阶函数 一个函数就接收另一个函数作为参数,这种函数就称之为高阶函数 1.高阶函数之map: ...
随机推荐
- java基础小测试
1.JDK,JRE,JVM三者的区别 jdk:java 开发工具包 jre:运行环境 jvm:虚拟机 2.javac的作用 ,反编译工具的作用 javac:将java文件编译成class文件 反编译: ...
- ssvm和console 模板机 连接不上管理节点
说明: cloudstack 版本http://www.shapeblue.com/packages/ 并不是官方的 systemvm64template-4.6.0-vmware.ova 官 ...
- 趴一趴京东的Ajax动态价格页面
AJAX,异步加载技术!!! 之前在网上看过很多朋友有一种疑问,为什么在看京东网页的源代码里面看不到价格或则折扣一类的数据,而在网页上正常显示却能看到?...之前我也没有想到是AJAX,因为我写写爬虫 ...
- dp 加搜索 百练1088 滑雪
描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长的 ...
- 【lct】bzoj2002 [Hnoi2010]Bounce 弹飞绵羊
lct板子,此题主要有cut操作和link操作. #include<cstdio> #include<iostream> #include<cstring> #in ...
- 没有调用PageHelper.startPage()分页方法,最后还是执行了PageHelper分页方法的原因
SELECT * FROM ( SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( ...
- bzoj4034 树上操作
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- bzoj1375 双调路径
Description 来越多,因此选择最佳路径是很现实的问题.城市的道路是双向的,每条道路有固定的旅行时间以及需要支付的费用.路径由连续的道路组成.总时间是各条道路旅行时间的和,总费用是各条道路所支 ...
- Codeforces Round #245 (Div. 2) A. Points and Segments (easy) 贪心
A. Points and Segments (easy) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...
- 无法读取Excel中的数据单元格。有数据,但是读出来全是空值
C#读取Excel,取值为空的解决办法! C#读取Excel遇到无法读取的解决方法是什么呢?这样在C#读取Excel的过程中有很多问题,那么本文就向你介绍如何解决C#读取Excel遇到无法读取的解决方 ...