ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第一章:过程抽象引入

第一章:过程抽象引入 第一章构造过程抽象第一章的主要内容编程方式带领读者熟悉lisp的编程方式核心抽象介绍过程抽象计算内容算法作为计算对象现在sicp开始了它要从零定义一门编程语言也可以是你自己从零定义一门编程语言。**要进行计算首先我们引入表达式。**一个数是一个表达式。加减乘除是这样的表达式( 1 2) (- 3 4) (* 2 53) (/ 8 2)这样的表达式称为组合式。组合式是由一个运算符加上它的操作数元素然后将它们括起来组成的。对于四则运算它们的操作数可以是任意多个。组合式允许嵌套组合式的元素可以是组合式。lisp通过解释器运行和解释器交互可以得到对应的结果给事物命名。通过define可以将一个名字与值绑定就如同给他起名一样。这个名字称为变量。通过(define size 2)将size和2绑定。可以给数字命名。然后使用这些名字参与计算。lisp就有某种存储能力能记忆名字的值这种存储称为环境±*/也可以看成环境中的名字组合式求值。定义求值子表达式和将运算符运用到子表达式上。在性质上这是一个递归定义也就是说它在描述它的定义时引用了它本身。相比使用其他方法递归的定义是十分简洁优雅的。可以想象这是一个树形结构值在由下往上穿行。lisp由通用形式括号内的第一个元素运用于其他元素上和特殊形式例如define构成复合过程给操作起名(define (square x) (* x x))这会将square这个名字和一个组合式关联这和我们熟悉的函数很像。过程定义遵循着这样的形式(define (name formal parameters*) body)调用过程(square 2) ( (square 2) (square 3))。这和四则运算是一样的只不过四则运算是预先定义好的。条件表达式和谓词(cond(p1e1)(p2e2)...)若p1为真就返回e1否则检查下一个。p1称为谓词基本谓词包括 它们都返回真和假以及复合逻辑运算符and or not(if(p)e1 e2)若p为真返回e1否则返回e2。复杂运算示例使用牛顿迭代法求开根号2是时候来点代码了(define(averagex y)(/(x y)2))(define(squarex)(*x x))(define(sqrtx)(defineprecision0.0001)(definestart1)(define(good-enough? guess)((abs(-(squareguess)x))precision))(define(improveguess)(averageguess(/x guess)))(define(sqrt-iterguess)(if(good-enough? guess)guess(sqrt-iter(improveguess))))(sqrt-iterstart))(exact-inexact(sqrt2))牛顿迭代法基于现在的猜测guess对于根号2的下一个更好这是一定的的猜测是(average (guess (/ x guess)))。同时为了不污染命名空间这里引入新的语法特性内部定义即在过程内定义过程和变量的能力这和外部定义没有区别只是从全局定义变为局部定义。定义辅助过程square和average。定义sqrt-iter这是主实现过程使用一个递归实现。如果认为猜测够好了那么返回猜测否则使用improve来得到一个新的更好的猜测递归调用。定义sqrt作为对外暴露的接口传入x返回的是x开根号2。其实现是sqrt-iter从猜测1开始。Lisp的计算特点从开始到现在我们只是要我们自己定义的东西。你是不是也想问”哪些熟悉的编程概念呢“是以后定义吗不不是的。必须改变思维习惯而来适应Lisp同时问一个问题从开始到现在有任何不自然的地方吗答案是没有吧。因为我们所有的定义都是顺着我们的思考下来的而没有预先定义以后需要的情况。循环是没有的for和while这两个东西都没有只有递归也只需要递归。赋值也是没有的名字就是名字一个名字一旦和值绑定就不会变。我们只使用我们自己定义的东西。递归计算过程和循环计算过程有些计算虽然都为递归调用但计算过程却不同。有的所耗空间大要保存大量的上下文状态有的所耗空间小只需要一两个变量即可。前者需要不停展开然后才能收拢后者则是一个不停更新变量状态的过程。前者称为递归定义后者称为迭代定义。递归的。前者是(define(factorialn)(if(n1)1(*n(factorial(-n1)))))定义简洁很像数学定义计算慢所需空间大迭代的。后者是(define(factorialn)(define(itern res)(if(n1)res(iter(-n1)(*res n))))(itern1))速度快所需空间少定义不易读习题使用递归定义和迭代定义实现斐波那契数列的计算。
返回列表