YA

In me the tiger sniffes the rose.

  • 主页
  • 世界之内
  • 世界之外
  • 叶隙随笔
所有文章 友链 关于我

YA

In me the tiger sniffes the rose.

  • 主页
  • 世界之内
  • 世界之外
  • 叶隙随笔

零 《SICP》笔记:构造过程抽象

阅读数:22209次 2018-07-23
字数统计: 2.2k字   |   阅读时长≈ 9分

The acts of the mind, wherein it exerts its power over simple ideas, are chiefly these three: 1. Combining several simple ideas into one compound one, and thus all complex ideas are made. 2. The second is bringing two ideas, whether sim- ple or complex, together, and setting them by one another so as to take a view of them at once, without uniting them into one, by which it gets all its ideas of relations. 3. The third is separating them from all other ideas that accom- pany them in their real existence: this is called abstraction, and thus all its general ideas are made.
—John Locke, An Essay Concerning Human Understanding (1690)

第一章 构造过程抽象

这章准备学习的是有关计算过程的知识。

什么是计算过程?计算过程是一种能操控称之为数据的抽象事物而进行本质上由数值运算构成的一系列进程的过程。程序员就像巫师念出一串咒语——他们编出一系列程序来作为计算过程的准则,来规范和指导计算过程的进行。

程序设计的基本元素

任何一种程序设计语言都必须要有三个机制作为基础:

  • 基本表达形式
  • 组合的方法
  • 抽象的方法

三要素

基本表达式:

这样说过于翻译腔,其实很好理解,所为基本表达形式,就是基本表达式,包括诸如“+”,“-”,“*”,“/”一类内嵌于编程语言中的基本操作。

组合的方法:

将表达式用“()”集合起来,形成符合表达式,比如
​ ​ (+ 1 2) ​
输出就是

1
3

像这样的表达式称为组合式,在Lisp中,操作符总是出现在最左边,而后面出现的则是操作对象,一般都是数字。

抽象的方法

在Lisp中,给事物命名通过define操作来实现。比如:

1
(define size 2)

会告诉解释器,将2与“size”相关联,size称为表示值2的另一种方式。

define是我们所用语言中做简单的抽象方法,它允许解释器用一个名字来引用一系列很复杂的组合运算结果,来简化程序构造过程。

复合过程

我们已经可以通过Lisp看到某些元素,这些元素必然也会出现在其他编程语言中。这些元素包括:

  • Numbers and arithmetic operations are primitive data and procedures.
  • Nesting of combinations provides a means of combining opera- tions.
  • Definitions that associate names with values provide a limited means of abstraction.

define可用于另一种定义:过程定义

我们想想,如何实现“平方”这个概念?在Lisp中,应该这样实现:

1
(define (square x) (* x x))

这样我们就实现了一个复合过程,x作为局部变量,square x是 x平方 操作的引用,我们将x平方定义为sqare x 后,就能将它作为基本元素应用在其他任何地方。

过程作为黑箱抽象

这一思想本质即追求简化,避免错误,减少工作量。举个例子,我们现在要求x的平方根,程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(define (sqrt x) 
(sqrt-iter 1.0 x))

(define (sqrt-iter guess x) (if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))

(define (improve guess x)
(average guess (/ x guess)))

(define (average x y)
(/ (+ x y) 2))

(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))

sqrt是我们用手工定义的过程来实现的计算过程,这个程序可以看做一个树形结构:

Tree Structure

将一个大问题分解为一个个小问题,sqat作为一个黑箱,是一个过程的抽象。我们不需要在意sqrt-iter实现了什么操作,我们只需要把它作为一个黑箱,有输入输出即可。

我们还可以将定义内部化,形成嵌套的定义,如:

1
2
3
4
5
6
7
8
(define (sqrt x)
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess x) (average guess (/ x guess)))
(define (sqrt-iter guess x)
(if (good-enough? guess x) guess
(sqrt-iter (improve guess x) x)))
(sqrt-iter 1.0 x))

因为x作为局部变量,已经在开头定义过了,所以内部定义再定义x,是没有必要的,所以可以改进为:

1
2
3
4
5
6
7
8
(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess)(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess) guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))

以上的定义称之为块结构

过程与它们所产生的对象

程序机制<——>程序行为

——>代换模型(正则序)

递归:time = O(X)

space = O(X)

迭代:time = O(X)

space = O(1)

迭代和递归的区别?

Diffenrance

(编程实际上是在编写一种通用规则)

递归过程——递归计算过过程

scheme特点:尾递归

什么是尾递归:

函数式编程非常重要的一个概念是递归。在函数式编程里面,递归是原生的合乎情理的,是从lambda计算继承而来的;而迭代(循环)是不良的,因为它的副作用,因为迭代(循环)意味着修改变量的值,违背了函数式编程的本意。修改变量的值是某些纯粹的函数式编程语言所坚决摈弃的,比如haskell。而scheme采取了更务实的做法支持修改变量的值,并且保留了迭代(循环)的语法。这是非常有趣和值得探讨的。我们知道,当一个函数的返回语句是另一个函数的直接调用,可称为尾调用tail call。尾调用的优点是节省程序运行时间和空间。因为函数每一层的嵌套调用,都意味着一个新的栈帧stack frame。栈帧保留了诸如实参值,局部变量,访问链,返回地址等信息,构造和销毁栈帧是程序运行时的开销。而尾调用,可以避免在内存中保留caller函数的栈帧,只需要直接把caller的返回地址复制到callee的返回地址。一般情况下的尾调用,优势不明显,但是如果是层次非常多的递归调用,则可以大大发挥作用。这种递归叫做尾递归。优化后的尾递归,即直接传递返回地址的尾递归,与过程式编程的迭代(循环)类同。以阶乘为例:

1
2
3
(define (factorial n)
(if (= n 0) 1
(* n (factorial (- n 1)))))

这是非尾递归的阶乘。可以看出,每次递归调用,都要保留caller函数的栈帧,因为callee的返回值还要继续*n的操作才能返回caller的值。
1
2
3
(define (factorial n acc)
  (if (= n 0) acc
        (factorial (- n 1) acc*n)))

这是尾递归的阶乘。可以看出,每次递归调用,都是同一个函数的不同参数调用,不需要保存多个栈帧,只要有一个栈帧即可。

高阶函数

过程作为参数:

语法——> 公共模式

公共模式:

1
2
3
4
5
6
7
8
9
(define (sum term a next b) 

(if (> a b)

0

(+ (term a)

(sum term (next a) next b))))

一.求立方和

1
2
3
4
5
(define (inc n) (+ n 1)) 

(define (sum-cubes a b)

(sum cube a inc b))

二.求和

1
2
3
4
5
(define (identity x) x) 

(define (sum-integers a b)

(sum identity a inc b))

三.求莱布尼茨公式

1
2
3
4
5
6
7
8
9
10
11
(define (pi-sum a b) 

(define (pi-term x)

(/ 1.0 (* x (+ x 2))))

(define (pi-next x)

(+ x 4))

(sum pi-term a pi-next b))

三种计算由于遵照同一种计算模式,故都可由我们自定义的sum公共模式来实现,而sum包含了next、term操作,即体现了“将过程作为参数”。

lambda表达式

我们发现,不同需求所使用的term和next不同,我们要定义不同的term和next,这样很麻烦,也耗内存。

在这种next、term是一次性的要求下,我们引入lambda表达式,也许会更加好。

举个例子,我们计算莱布尼茨公式,引入lambda表达式,可以这样做:

将next变成:

(lambda (x) (+ x 4))

将term变成:

1
(lambda (x) (/ 1.0 (* x (+ x 2)))) 

则计算莱布尼茨公式则为:

1
2
3
4
5
6
7
8
9
(define (pi-sum a b)

(sum (lambda (x) (/ 1.0 (* x (+ x 2))))

a

(lambda (x) (+ x 4))

b))

寻找一种公共的模式,这实际上是把过程进行了封装。如果我们运行刚开始提出的程序来求和,一旦需求改变,整个程序都得重写。但如果我们使用后面提出的程序,因为我们将sum这个过程进行了封装,所以无需改变其他与需求无关的程序,只要改sum就好了。

过程作为返回值

简单来说就是定义一个含有函数作为参数的另一个函数,比如:

1
2
3
(define (ave-damp f)

(lambda(x) (average x (f x) ) ) )

就是把add f 定义为一个过程

In general, programming languages impose restrictions on the ways in which computational elements can be manipulated. Elements with the fewest restrictions are said to have first-class status. Some of the “rights and privileges” of first-class elements are:

  • They may be named by variables.

  • They may be passed as arguments to procedures.

  • They may be returned as the results of procedures.

  • They may be included in data structures.

Lisp, unlike other common programming languages, awards procedures full first-class status. This poses challenges for efficient implementation, but the resulting gain in expressive power is enormous.

赏

谢谢你请我吃糖果

支付宝
微信
  • 本文作者: YA
  • 本文链接: http://www.yuuuuang.com/2018/07/23/零-《SICP》读书笔记:构造过程抽象/
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
  • 世界之内

扫一扫,分享到微信

周记|原爆点
Norms or maybe more
  1. 1. 第一章 构造过程抽象
    1. 1.1. 程序设计的基本元素
      1. 1.1.1. 三要素
        1. 1.1.1.1. 基本表达式:
        2. 1.1.1.2. 组合的方法:
        3. 1.1.1.3. 抽象的方法
      2. 1.1.2. 复合过程
      3. 1.1.3. 过程作为黑箱抽象
    2. 1.2. 过程与它们所产生的对象
      1. 1.2.0.1. 什么是尾递归:
  2. 1.3. 高阶函数
    1. 1.3.0.1. 过程作为参数:
      1. 1.3.0.1.1. lambda表达式
    2. 1.3.0.2. 过程作为返回值
© 2018-2025 YA
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量25794次 | 本站访客数20929人
  • 所有文章
  • 友链
  • 关于我

tag:

  • 随笔
  • 年终总结
  • 世界之内
  • 世界之外
  • 叶隙集
  • 机器学习
  • 叶隙随笔
  • 图像处理
  • 数据挖掘

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 2024年终总结

    2025-04-08

    #随笔#年终总结

  • 【叶隙集】41 盘旋的白文鸟

    2025-01-12

    #随笔#叶隙集

  • 大语言模型正在伤害人机交互领域的研究

    2025-01-05

    #随笔#世界之内

  • 【叶隙集】40 台湾旅行

    2024-12-22

    #随笔#叶隙集

  • 【叶隙集】39 搬家了

    2024-09-05

    #随笔#叶隙集

  • 2023年终总结

    2024-06-27

    #随笔#年终总结

  • 【叶隙集】38 参加学术会议

    2024-05-22

    #随笔#叶隙集

  • Notes of 3D Gaussian Splatting

    2024-03-19

    #世界之内

  • 【叶隙集】37 音乐会和朋友

    2023-12-04

    #随笔#叶隙集

  • 【叶隙集】36 QE和音乐会

    2023-11-02

    #随笔#叶隙集

  • 【叶隙集】35 新室友和更积极的生活

    2023-09-11

    #随笔#叶隙随笔

  • 读书笔记|《规训与惩罚》

    2023-08-27

    #随笔#世界之外

  • 【叶隙集】34 无法参加学术会议

    2023-06-28

    #随笔#叶隙集

  • 【叶隙集】33 回国后与朋友和家人们的聚会

    2023-06-11

    #随笔#叶隙集

  • 视频压缩技术概述

    2023-04-28

    #世界之内

  • 2022年终总结

    2023-03-31

    #随笔#年终总结

  • 【叶隙集】32 平和的心态

    2022-12-27

    #随笔#叶隙集

  • 【叶隙集】31 双相情绪障碍症

    2022-12-17

    #随笔#叶隙集

  • 【学习笔记】CS5229 Advanced Computer Network

    2022-12-17

    #世界之内

  • 【叶隙集】30 下半学期太忙了!

    2022-11-25

    #随笔#叶隙集

  • 【叶隙集】29 当助教的半个学期

    2022-10-07

    #随笔#叶隙集

  • 【叶隙集】28 忙碌的第一个月

    2022-08-31

    #随笔#叶隙集

  • 【叶隙集】27 老师的职责

    2022-07-31

    #随笔#叶隙集

  • 【叶隙集】26 新加坡太难找工作了

    2022-07-23

    #随笔#叶隙集

  • 【叶隙集】25 生产工具、学习生活和阅读笔记

    2022-07-15

    #随笔#叶隙集

  • 【叶隙集】24 学习、科研、旅行和爱与关怀

    2022-06-24

    #随笔

  • 【叶隙集】23 学习与研究

    2022-04-26

    #随笔#叶隙集

  • 【学习笔记】人工智能规划与决策

    2022-04-26

    #世界之内

  • 博士申请的总结

    2022-03-31

    #随笔

  • 【叶隙集】22 新的体验和宗教

    2022-03-07

    #随笔#叶隙集

  • 2021年终总结

    2022-01-08

    #随笔#年终总结

  • 【叶隙集】21 新朋友和学术报告

    2021-10-31

    #随笔#叶隙集

  • 【叶隙集】20 音乐会与教训

    2021-10-19

    #随笔#叶隙集

  • 【叶隙集】19 六周年纪念日

    2021-10-03

    #随笔#叶隙集

  • 【叶隙集】18 疫情与疫苗

    2021-09-24

    #随笔#叶隙集

  • 摘录|联合国2021年气候问题总结报告的摘要

    2021-09-19

    #世界之外

  • 【叶隙集】17 音乐会和读书

    2021-09-08

    #随笔#叶隙集

  • 【叶隙集】16 喜欢上了游泳

    2021-09-01

    #随笔#叶隙集

  • 【叶隙集】15 课前的夜曲

    2021-08-24

    #随笔#叶隙集

  • 【叶隙集】14 平稳的学习生活

    2021-08-16

    #随笔#叶隙集

  • 【叶隙集】13 生活与朋友

    2021-07-15

    #随笔#叶隙集

  • 【叶隙集】12 毕业

    2021-06-30

    #随笔#叶隙集

  • 【叶隙集】11 毕业前的生活

    2021-06-23

    #随笔#叶隙集

  • 读书笔记|《国境以南,太阳以西》读后感

    2021-06-17

    #随笔

  • 【叶隙集】10 青甘环线旅行

    2021-06-13

    #随笔#叶隙集

  • 半监督学习|论文粗读

    2021-06-07

    #机器学习

  • 【叶隙集】9 纯粹地生活

    2021-06-06

    #随笔#叶隙集

  • 【叶隙集】8 生活的界限

    2021-05-30

    #随笔#叶隙集

  • 【叶隙集】7 隔离结束

    2021-05-21

    #随笔#叶隙集

  • 【叶隙集】6 隔离生活

    2021-05-14

    #随笔#叶隙集

  • 【叶隙集】5 新的阶段

    2021-05-08

    #随笔#叶隙集

  • 【叶隙集】4 团队管理

    2021-04-30

    #随笔#叶隙集

  • 【叶隙集】3 过低的自我评价

    2021-04-23

    #随笔#叶隙集

  • 【叶隙集】2 方向与交往

    2021-04-16

    #随笔#叶隙集

  • 【叶隙集】1 原爆点-续

    2021-04-08

    #随笔#叶隙集

  • 随笔|目的与纯粹

    2021-03-28

    #随笔

  • 随笔|白文鸟

    2021-01-20

    #随笔

  • 写在一百以后——2020年终总结

    2021-01-01

    #随笔#年终总结

  • 随笔|选择

    2020-12-25

    #随笔

  • 读书笔记|《人生的意义》总结、摘录

    2020-11-25

    #世界之外

  • 书评|Normal People, Normal Love

    2020-10-07

    #随笔

  • Decision Making|人工智能、机器学习与强化学习的概述与比较

    2020-10-03

    #世界之内

  • 随笔|疫情后的总结

    2020-09-10

    #随笔

  • 学习笔记@PRML|1 Introduction

    2020-07-31

    #世界之内

  • 随笔|面试后的回顾与思考

    2020-07-26

    #随笔

  • 数据挖掘|数据挖掘概论笔记

    2020-06-24

    #世界之内#数据挖掘

  • 续写|美女或野兽

    2020-06-18

    #随笔

  • 随笔|无常

    2020-05-31

    #随笔

  • 现象学|胡塞尔《小观念》笔记

    2020-05-13

    #世界之外

  • 随笔|我的局限性

    2020-05-13

    #随笔

  • 随笔|胡乱的记录

    2020-04-09

    #随笔

  • 随笔|疫情

    2020-02-16

    #随笔

  • 随笔|怅惘地忖度

    2020-01-29

    #随笔

  • 2019年终总结

    2019-12-08

    #随笔#年终总结

  • 机器学习|Flow-based Model学习笔记

    2019-11-06

    #世界之内#机器学习

  • 【Introduction to TensorFlow】03 卷积神经网络与复杂数据集

    2019-10-31

    #世界之内#机器学习

  • 【Introduction to TensorFlow】02 初识机器学习与计算机视觉

    2019-10-29

    #世界之内#机器学习

  • 【Introduction to TensorFlow】01 TF 快速入门

    2019-10-29

    #世界之内#机器学习

  • 【Introduction to TensorFlow】00 课程概览

    2019-10-29

    #世界之内#机器学习

  • 随笔|呓语

    2019-10-27

    #随笔

  • 周记|面纱 久别重逢

    2019-09-21

    #随笔

  • 学习笔记|拟合优化

    2019-09-15

    #世界之内

  • 周记|爱人 体验 芝诺

    2019-09-07

    #随笔

  • 摘录|造成不幸福的原因之六:嫉妒

    2019-09-06

    #世界之外

  • 随笔|虚无 纵欲

    2019-08-22

    #随笔

  • 周记|尘埃落定

    2019-06-29

    #随笔

  • 周记|本能 愉悦 基因

    2019-06-12

    #随笔

  • 周记|空荡荡

    2019-06-02

    #随笔

  • 四月裂帛——读《女儿红》

    2019-05-30

    #随笔#世界之外

  • 机器学习|主成分分析

    2019-05-10

    #世界之内#机器学习

  • 《好运设计》史铁生

    2019-05-09

    #世界之外

  • 机器学习|感知机与支持向量机

    2019-04-27

    #世界之内#机器学习

  • 周记|记忆 概念 庸俗

    2019-04-27

    #随笔

  • 机器学习|模型评估与选择

    2019-04-17

    #世界之内#机器学习

  • 机器推理|SLD Resolution

    2019-04-06

    #世界之内

  • 第五代计算机

    2019-03-31

    #世界之内

  • 学习笔记|Volume Rendering

    2019-03-31

    #世界之内#图像处理

  • 周记|三月驼云

    2019-03-28

    #随笔

  • 生成对抗网络与强化学习:文本生成的方法

    2019-03-11

    #世界之内

  • 《桨声灯影里的秦淮河》俞平伯

    2019-03-09

    #世界之外

  • 周记|雨

    2019-03-09

    #随笔

  • 《春之积雪》简媜

    2019-03-01

    #世界之外

  • 周记|逃离

    2019-02-15

    #随笔

  • 存在主义是一种人道主义

    2019-02-11

    #世界之外

  • 学习笔记|比较文学

    2019-02-09

    #世界之外

  • 尼采的美学

    2019-02-01

    #世界之外

  • 哲学涉猎

    2019-02-01

    #世界之外

  • 读书笔记|光的诗人——《如何看懂印象派》

    2019-01-28

    #随笔#世界之外

  • 叔本华的生命意志哲学

    2019-01-25

    #世界之外

  • 再也不要把他们弄丢了

    2019-01-21

    #随笔

  • 2018年终总结

    2018-12-31

    #随笔#年终总结

  • 人类的心理行为模式

    2018-12-25

    #世界之外

  • 周记|神经症人格

    2018-12-22

    #随笔

  • 【周记】旋转

    2018-11-30

    #随笔

  • 七牛云Bucket失效

    2018-11-21

    #世界之内

  • 周记|从前的日色慢

    2018-11-21

    #随笔

  • 【数理逻辑】Incompleteness Theorem

    2018-11-10

    #世界之外

  • 专业随想

    2018-11-05

    #随笔

  • 生活

    2018-11-04

    #世界之外

  • 计算机组成与体系结构

    2018-11-04

    #世界之内

  • 【强化学习】Policy Gradient

    2018-11-03

    #世界之内

  • 怀疑是否有价值——怀疑论

    2018-10-30

    #世界之外

  • 周记|Every hero and coward

    2018-10-20

    #随笔

  • Web in Java

    2018-10-11

    #世界之内

  • 周记|十月女泽

    2018-10-02

    #随笔

  • 托福备考

    2018-09-28

    #世界之内

  • 周记|裸体之舞

    2018-09-24

    #随笔

  • 周记|中秋幸福

    2018-09-18

    #随笔

  • History of artificial intelligence

    2018-09-09

    #世界之外

  • 周记|我那无趣的灵魂

    2018-09-09

    #随笔

  • Softmax Regression

    2018-09-08

    #世界之内

  • 周记|Rational

    2018-09-02

    #随笔

  • 贰 《SICP》笔记:模块化、对象和状态

    2018-08-05

    #世界之内

  • 周记|困倦

    2018-08-04

    #随笔

  • 壹 《SICP》笔记:构造数据抽象

    2018-07-31

    #世界之内

  • 周记|原爆点

    2018-07-31

    #随笔

  • 零 《SICP》笔记:构造过程抽象

    2018-07-23

    #世界之内

  • Norms or maybe more

    2018-07-09

    #世界之内

  • 事已至此

    2018-06-24

    #随笔

  • 【增强学习】AirSim搭建

    2018-06-02

    #世界之内

  • 【机器学习】BP算法

    2018-05-26

    #世界之内

  • 【康德】宏大的哲学语境

    2018-05-26

    #世界之外

  • 【康德】康德的研究领域是什么

    2018-05-11

    #世界之外

  • 【高等数学】什么是梯度(期中考试复习思考)

    2018-04-29

    #世界之内

  • 《自控力》读书笔记

    2018-04-21

    #随笔

  • 【线性代数】The Essence of Linear Algebra

    2018-04-21

    #世界之内

  • 【数据结构与算法】临时抱佛脚

    2018-03-10

    #世界之内

  • 科技革命与人类社会——《论工业社会及其未来》读后感

    2018-03-08

    #随笔

  • 《论工业社会及其未来》原文摘录

    2018-02-23

    #世界之外

  • 《如何高效学习》读后总结

    2018-02-19

    #随笔

  • 《精进》chapter-2读后总结

    2018-02-13

    #随笔

  • A Review of Brian - Inspired Computer Vision

    2018-02-11

    #世界之内

  • 最近有个女生,说对我很失望

    2017-12-07

    #随笔

  • 病入膏肓

    2017-01-29

    #随笔

  • 白文鸟

    2016-10-29

    #随笔

  • 《不能承受的生命之轻》读后感

    2016-07-13

    #随笔

  • 都五月份了

    2016-04-29

    #随笔

  • 《四月裂帛》简媜

    2014-09-29

    #世界之外

  • Wuuuudle
  • Nemo
  • Elmo (yyh)
  • highestpeak
  • Kazoo Blog
努力做一名谦逊、独立、乐于思考的学生