计算机程序的构造和解释、中文编程
文章平均质量分 87
对于中文编程的一次摸索
X-jazz
任生命如烟火般绽放于夜空,似絮梦流过人间。
展开
-
递归与迭代 过程复杂度优化 04 slide版SICP 视频笔记
一、第一个例子:阶乘对于阶乘问题,如果我们完全用递归思想来描述,那一个数的阶乘就等于这个数乘以这个数减一的阶乘(特别地,规定数0的阶乘为1)。容易把这样的描述写为scheme代码,长下面这样:(define fact (lambda (n) (if (= n 1) 1 (* n (fact (- n 1))))))使用代换模型,这个程序的执行过程如下:这种代换出来是“大肚子”形状的便是递归过程。可以从代换出的形状看出,当运行到中间部分时,所需空间达到峰值,这个峰值空间原创 2021-05-29 13:14:26 · 1903 阅读 · 0 评论 -
ADT、幂等——数据导向的编程 04 slide MIT SICP 视频笔记
首先,从一个基础的加法定义开始,后面在给程序添加功能的过程中,会屡次分析程序中尚存在的由于类型规定不完善而出现的问题,通过一次次地完善类型定义,让我们感受抽象类型数据的定义方法,那下面是这个基础的加法定义:; type: Exp, Exp -> SumExp(define (make-sum addend augend) (list '+ addend augend))接下来书写判定一句表达式为加法式的语句:; type: anytype -> boolean(define原创 2021-05-27 20:13:48 · 1088 阅读 · 0 评论 -
86版 MIT SICP 计算过程 视频笔记(一)
本以为自己已经基本看懂了课程中所讲述的元循环求值器了,但种种事实证明,还欠火候,那再回过头来看看关于基础代换模型以及相关的一些知识吧。一、基础加法过程首先,直接先来看一个基础加法过程的实现:(define (+ a b) (if (= a 0) b (+ (-1+ a) (1+ b))))那对上面这个过程,应用代换模型,我们会得到:(+ 3 4)(if (= 3 0) 4 (+ (-1+ 3) (1+ 4)))(+ (-1+ 3) (1+ 4))(+ (-1+原创 2021-05-25 01:11:16 · 1136 阅读 · 2 评论 -
86版 MIT SICP lecture 流(一)视频笔记
一、IBM科学计算包中60%的程序本质上内部都会执行的几个流程视频中,老师提到自己的研究生曾分析过IBM公司的科学计算包的程序代码,其中高达60%的部分其实本质上都在执行以下四个流程:enumerate(枚举)、filter(筛选)、 map (映射)、accumulate(累积)。课程中老师举了两个过去的课中曾出现过的程序,将树中的奇数叶子结点求平方后求和以及获取斐波那契数列中的奇数项,但按原来的习惯写出的两个程序,虽然我们能分析出代码块中包含上述的四个过程,但这四个过程其实是相互混合,彼此不分离地体原创 2021-05-21 22:54:38 · 296 阅读 · 1 评论 -
scheme语言直译为汉语(十八)
一、复数的表示在之前的文章中,我曾有过一个疑问,就是scheme语言要怎么实现多态?这不,书里好像很快就给出了咱们这个疑问答案。我们知道复数有两种表示方式:1.直角坐标系表示法实部(z1+z2z_1+z_2z1+z2) = 实部(z1z_1z1) + 实部(z2z_2z2)虚部(z1+z2z_1+z_2z1+z2) = 虚部(z1z_1z1) + 虚部(z2z_2z2)2.极坐标系表示法模(z1+z2z_1+z_2z1+z2) = 虚部(z1z_1z1) + 虚部(z2z原创 2021-05-10 04:45:48 · 477 阅读 · 2 评论 -
scheme语言直译为汉语(十七)
一、符号数据在这一节里,我们要扩充所用语言的表述能力,引进将任意符号作为数据的作为数据的功能。1. 引号如果我们能构造出采用符号的复合数据,我们就可以有下面这类的表:(abcd)(23 45 17)((Norah 12) (Molly 9) (Anna 7) (Lauren 6) (Charlotte 4))这些包含着符号的表看起来就像是我们语言里的表达式:(* (+ 23 45) (+ х 9))(define (fact n) (if (= n 1) 1 (* n (fact (-原创 2021-04-29 12:14:30 · 469 阅读 · 0 评论 -
scheme语言直译为汉语(十六)
一、从序列中提取需要的多元组首先先看一个实例问题:给定了自然数n,找出所有不同的有序对i和j,其中1≤j<i≤n1 \leq j < i \leq n1≤j<i≤n,使得i+ji + ji+j是素数。例如,假定n是6,满足条件的序对就是:完成这一计算的一种很自然的组织方式:首先生成出所有小于等于n的正自然数的有序对;而后通过过滤,得到那些和为素数的有序对;最后对每个通过了过滤的序对(i, j), 产生出一个三元组(i, j, i+j)。那么要完成上面的工作,我们其实需要进行嵌套地枚原创 2021-04-21 22:01:01 · 260 阅读 · 0 评论 -
scheme语言直译为汉语(十五)
一、序列作为约定俗成的接口我们一直强调数据抽象在对复合数据的工作中的作用,借助这种思想,我们就能设计出不会被数据表示的细节纠缠的程序,使程序能够保持很好的弹性,得以应用到不同的具体表示上。在这一节里,我们将要介绍与数据结构有关的另一种强有力的设计原理——使用约定的接口。在1.3节里我们看到,可以通过实现为高阶过程的程序抽象,抓住处理数值数据的一些程序模式。要在复合数据上工作做出类似的操作,则对我们操控数据结构的方式有着深刻的依赖性。举个例子,考虑下面与2.2.2节中count-leaves过程类似的过程原创 2021-04-19 22:45:32 · 250 阅读 · 0 评论 -
对裘宗燕翻译的《计算机程序的构造和解释》出现的翻译问题的一点点小看法
一、2.2.3节将Sequences as Conventional Interfaces翻译为“序列作为一种约定的界面”这里通过对本节内容的阅读,我认为将Interface翻译为“接口”会更好一些,因为本节在讲对于序列数据结构存储的数据的批量处理的过程的更为抽象的实现方式,序列在这些过程中扮演的角色即是一个约定俗成的接口参数。...原创 2021-04-17 13:58:18 · 303 阅读 · 0 评论 -
Scheme语言直译为汉语(十四)
一、对表的映射一个特别有用的操作是将某种变换应用于一个表的所有元素,得到所有结果构成的表。举例来说,下面过程将一个表里的所有元素按给定因子做一次缩放:(define (scale-list items factor) (if (null? items) nil (cons (* (car items) factor) (scale-list (cdr items) factor))))(scale-list (list 1 2 3 4原创 2021-04-17 12:51:13 · 287 阅读 · 0 评论 -
Scheme语言直译为汉语(十三)
一、序列的表示可以用序对cons如此表示序列:1、表操作1.查询序列第n项:利用序对将元素的序列表示为表之后,我们就可以使用常规的程序设计技术,通过顺序“向下cdr"表的方式完成对表的各种操作了。例如,下面的过程list-ref的实际参数是一个表和一个数n,它返回这个表中的第n个项。这里人们习惯令表元素的编号从0开始。计算list-ref的方法如下:●对n=0,list-ref应返回表的car。.●否则,list-ref返回表的cdr的第 (n-1)个项。(define (list-ref原创 2021-04-12 20:36:41 · 218 阅读 · 0 评论 -
Scheme语言直译为汉语(十二)
序对cons还可以怎样实现(define (cons x y) (define (dispatch m) (cond ((= m 0) x) ((= m 1) y) (else (error "Argument not 0 or 1 -- CONS" m)))) dispatch)(define (car z) (z 0))(define (cdr z) (z 1))尝试把上述过程直译为汉语:(定义 (序对原创 2021-03-31 12:52:13 · 227 阅读 · 0 评论 -
Scheme语言直译为汉语(十一)
练习1请考虑平面上线段的表示问题。一个线段用一对点表示,它们分别是线段的始点与终点。请定义构造函数make-segment和选择函数start-segment.、end-segment,它们基于点定义线段的表示。进而,一个点可以用数的序对表示,序对的两个成分分别表示,点的x坐标和y坐标。请据此进一步给出构造函数make-point和选择函数x-point、y-point,用它们定义出点的这种表示。最后,请基于所定义的构造函数和选择函数,定义出过程midpoint-segment,它以一个线段为参数,返回线原创 2021-03-27 14:21:28 · 183 阅读 · 0 评论 -
Scheme语言直译为汉语(十)
一、有理数运算接下来,我们要用一个有理数运算的例子来感受需要进一步抽象的程序要如何来设计。作为开始,我们假定已经有了一种从分子和分母构造有理数的方法。并进一步假定, 如果有了一个有理数,我们有一种方法取得(选出)它的分子和分母。现在再假定有关的构造函数和选择函数都可以作为过程使用:(make-rat ) 返回一个有理数,其分子是整数<n>,分母是整数<d>。(numer <x>) 返回有理数<x>的分子。(denom <x>) 返回有原创 2021-03-26 09:35:51 · 251 阅读 · 0 评论 -
Scheme语言直译为汉语(八)
用高阶函数做抽象在作用上,过程也就是一类抽象,它们描述了一些对于数的复合操作,但又不依赖于特定的数。例如,在定义:(define (cube x) (* x x x))(尝试把上面这句直译为中文):(定义 (立方 元) (* 元 元 元))时,我们讨论的并不是某个特定数值的立方,而是对任意的数得到其立方的方法。除了把数值计算抽象为过程并把数值作为参数,我们还可以针对高阶计算过程把一些简单的数值计算过程本身作为参数来进行进一步的抽象。一、过程作为参数考虑下面三个过程,第一个计算从a到b的各原创 2021-03-25 00:15:18 · 251 阅读 · 0 评论 -
Scheme语言直译为汉语(四)
一、线性的递归和迭代首先考虑由下面表达式定义的阶乘函数:n!=n⋅(n−1)⋅(n−2)……3⋅2⋅1n! = n \cdot (n-1) \cdot (n-2) ……3 \cdot 2 \cdot 1n!=n⋅(n−1)⋅(n−2)……3⋅2⋅1计算阶乘的方式有许多种,一种最简单方式就是利用下述认识:对于一个正整数nnn,n!n!n!就等于nnn乘以(n−1)!(n-1)!(n−1)!:n!=n⋅[(n−1)⋅(n−2)……3⋅2⋅1]=n⋅(n−1)!n! = n \cdot [(n-1) \c原创 2021-03-22 13:23:45 · 288 阅读 · 0 评论 -
Scheme语言直译为汉语(七)
一、求取最大公因数的欧几里得算法算法思想基于以下观察,如果r是a除以b的余数,那么a和b的公约数正好也是b和r的公约数,用等式表示:GCD(a,b) = GCD(b,r)GCD : greatest common divisor,最大公因数(公约数)这就把一个求取最大公因数的问题连续地归约到对越来越小的整数对求最大公因数的计算问题。例如:GCD(206,40) = GCD(40,6) = GCD(6,4) = GCD(4,2) = GCD(2,0) = 2将GCD原创 2021-03-19 20:55:40 · 339 阅读 · 0 评论