计算机程序构造与解释免费,《计算机程序的构造和解释(SICP)》学习笔记

计算机科学不是一门如何使用计算机的学科,它也不是科学,就好像几何学不是教你怎么使用工具进行测量的学科。

作为一门工程学科,它有很多和其他工程学科一样的一些要点:

抽象

Mit-Scheme的安装和使用

在使用Mit-Schme的时候,我对里面的7 error>感到奇怪,error前面的数字是什么呢?原来表示Scheme出错循环的层数。

第一章 构造过程抽象

计算过程是操作计算机里面的被称为数据的精灵的魔法,程序是操作这些精灵的规则模式;

Lisp语言最早是一种数学计数形式,它的优点:能够将过程表示为数据。

程序设计的基本元素

程序语言应该是能够组织有关计算过程思想的框架。包含三种机制:

基本表达形式(精灵,基本的规则)

组合的方法

抽象的方法

表达式:基本数据和基本过程表达式

组合式,用括号包含表达式

命名: 计算对象的别名 (define size 2)

环境:维持符号与特定的值的存储

组合式求值:是一个递归的过程,对于一个组合式,先求其左边的值,对于其左边的组合式,也是同样地规则,先求其左边的值。

复合过程:用别名代替过程 (define (square x) (* x x))

Lisp采用应用序求值,也就是先求出每个过程的值才得到结果,而不是先展开再求值

条件表达式,这个是求绝对值

(define (abs x)

(cond ((> x 0) x)

((= x 0) 0)

((< x 0) (- x))

)

)

牛顿表达式求平方根,求x的平方根的时候,先给出一个猜测值guess,比较猜测值guess的平方与x的差是否达到了精度,达到了就返回猜测值,否则,用改进值代替猜测值guess继续计算,改进的方法是取guess和(x/guess)的平均值

(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)

)

(define (sqrt x)

(sqrt-iter 1 x)

)

如同摄影师知道什么样的光圈会产生什么样的结果,能够看清所考虑的动作的后果,才是专家。

执行递归时需要存储的操作轨迹的长度会和n成正比的递归被称为线性递归。

斐波拉契数列的计算,根据其定义写出来的递归过程,这是一种树形递归,会有太多的冗余计算。

(define (fib n)

(cond ((= n 0) 0)

((= n 1) 1)

(else (+ (fib (- n 1))

(fib (- n 2)))

)

)

)

线性迭代,类似于其他语言的循环,count是初始计数,max-count是终止条件需要满足的值,product是累计的结果值,此处是求n的阶乘。

(define (fact-iter product count max-count)

(if (> count max-count)

product

(fact-iter (* product count)

(+ count 1)

max-count

)

)

)

(define (factorial n)

(fact-iter 1 1 n)

)

把上面的计算斐波拉契数列的树形递归换成线性迭代,效率更高,但是并没有那么直观。

(define (fib-iter a b n)

(if (= n 0)

b

(fib-iter (+ a b) a (- n 1))

)

)

(define (fib n)

(fib-iter 1 0 n)

)

把1美元换成1,5,10,25,50美分这五种硬币,共有多少种兑换的方式?

1.先考虑一个缩小问题规模的方式,把1美元换成1,5,10,25,50美分硬币的方式等于把1美元换成除了50美分硬币以外的所有硬币(注意:此时,问题的规模缩小了,硬币种类数降低了)的方式数加上用了50美分硬币的所有方式数,这是简单地概率学问题。

2.用了50美分硬币的情况下,可以确定至少有一个50美分硬币,也就是说其情况数等于1美元减去50美分的硬币的总额换成所有5种硬币的方式数量,(注意:此时,问题的规模缩小了,总额降低了)

3.考虑退化情况,也就是问题规模不能够再缩小的情况

总额为0时,可以看做有1种方式

总额<0时,可以看做有0种方式

硬币种类数<0时,可以看做有0种方式

接下来可以写程序了,用(count-changes 100)即可求出结果

(define (count-changes amount)

(cc amount 5)

)

(define (cc amount kinds-of-coins)

(cond ( (or (< amount 0)

(= kinds-of-coins 0)

)

0

)

( (= amount 0)

1

)

(else (+ (cc amount (- kinds-of-coins 1))

(cc (- amount (amount-of-coins kinds-of-coins)) kinds-of-coins)

)

)

)

)

(define (amount-of-coins count)

(cond ((= count 1) 1)

((= count 2) 5)

((= count 3) 10)

((= count 4) 25)

((= count 5) 50)

)

)

描述问题的计算资源消耗随问题规模增加的变化的方式,用增长阶,Θ(n)表示线性增长,Θ(1)表示常数增长。下面看一个求幂的方法的增长阶:

Θ(n)步和Θ(n)空间,线性递归

(define (exp x n)

(if (= 0 n)

1

(* x (exp x (- n 1)))

)

)

Θ(n)步和Θ(1)空间,线性迭代

(define (exp-iter b counter product)

(if (= 0 counter)

product

(exp-iter b (- counter 1) (* b product))

)

)

(define (exp x n)

(exp-iter x n 1)

)

Θ(log n)的步和空间,n为奇数时,计算的方法一样,x^n = x^(n-1) * x,n为偶数时,x^n = x^(n/2) * x^(n/2)

(define (fast-exp x n)

(cond ((= 0 n) 1)

((even? n)

(* (fast-exp x (/ n 2))

(fast-exp x (/ n 2))

)

)

(else (* x (fast-exp x (- n 1)))

)

)

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《计算机程序构造解释》是一本经典的计算机科学教材,它由Harold Abelson和Gerald Jay Sussman创作,已经成为计算机科学领域的里程碑之一。该教材于1979年首次出版,最新版是第二版。 该书的主要内容包括两个方面:计算机程序构造解释。首先,它详细解释计算机程序构造,强调了程序的基本要素和组织原则。这可以帮助读者理解如何使用编程语言和工具构建高效和可靠的计算机程序。书中还介绍了一些常见的编程范式和设计模式,如函数式编程和面向对象编程,使读者能够选择适合自己项目的最佳方法。 其次,该书解释计算机程序解释过程。它介绍了一种称为Lisp的编程语言,这是一种函数式编程语言,非常适合表达和解释复杂的计算机程序。通过详细讲解Lisp的语法和语义,读者可以深入了解程序如何被计算机解释和执行。这对于理解计算机底层工作原理和实现高性能程序非常有帮助。 《计算机程序构造解释》被广泛认为是计算机科学入门的必读教材。它不仅适合计算机科学专业的学生学习,也适合对计算机程序有兴趣的非专业读者。该书的内容深入浅出,兼具理论和实践,读者可以通过阅读本书并进行相应的练习来提高他们的编程能力和计算机科学理解。 总之,《计算机程序构造解释》是一本经典的计算机科学教材,它介绍了计算机程序构造解释两个重要方面。通过学习本书,读者可以掌握构建高效和可靠程序的技巧,并深入理解计算机程序的执行过程。这本书对于计算机科学专业学生以及对计算机程序感兴趣的非专业读者都是极其有价值的。 ### 回答2: 《计算机程序构造解释》(简称SICP)是一本经典的计算机科学教材,该书由麻省理工学院的编程语言专家哈罗德·艾布尔森(Harold Abelson)和吉拉迪·塞斯曼(Gerald Jay Sussman)共同编写。它在计算机科学领域具有重要的地位和影响力。 该书的主要内容围绕着计算机程序构造解释展开。它从一个通用的编程语言(Scheme)出发,通过讲解计算机程序的抽象、过程和数据的重要概念,帮助读者建立起正确的思维模式和编程方法。 SICP通过一系列的例子和习题,引导读者通过编程实践来加深对计算机程序的理解。它强调程序设计的原理、模块化、抽象和递归等重要思想,通过一步步的讲解和示例,帮助读者培养出优雅和高效的编程风格。 SICP的目标是让读者真正理解计算机程序的本质,并学会如何用一种简单而强大的编程语言来构建复杂的软件系统。它不仅仅是一本教科书,更是一部引导读者探索计算机科学本质的指南。 总的来说,《计算机程序构造解释》是一本重要的计算机科学经典教材,它的初版已经出版超过30年,至今仍然是计算机科学教育领域的重要参考书之一。阅读该书可以帮助读者真正理解计算机程序的本质和设计原则,提升编程能力和思维方式。 ### 回答3: 《计算机程序构造解释》(SICP)是一本经典的计算机科学教材,也是学习编程的重要参考书籍。 这本书以文学化的形式介绍了计算机程序是如何构造解释的。它通过简明易懂的语言和丰富的示例,向读者解释了编程语言的设计原则、计算过程的原理以及如何理解和构造复杂的程序。 SICP主要分为五个部分。第一部分介绍了程序设计的基本概念和过程抽象的重要性。第二部分介绍了数据抽象和高阶过程,帮助读者理解程序设计中的重要概念和方法。第三部分讨论了程序设计的不同风格和编程的复杂性。第四部分介绍了元语言解释器的实现,帮助读者理解编程语言的工作原理。第五部分则介绍了一些高级主题,如并发和非确定性计算。 这本书的独特之处在于它不仅仅教授编程语言的具体细节,更重要的是让读者理解程序设计的理念和基本原则。它培养了读者逻辑思维和问题解决能力,帮助他们成为更好的程序员。 对于那些想要深入理解计算机程序构造解释的人来说,这本书是一个不可或缺的工具。它挑战了读者的思维,让他们思考计算机程序的本质和原理。无论是初学者还是有经验的程序员,阅读《计算机程序构造解释》都会有所收获,成为更好的计算机科学家或工程师。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值