sicp 习题(1)

*/-->

sicp 习题(1)

Table of Contents

  • 1. 1.1 求值
  • 2. 1.2 前缀形式转换
  • 3. 1.3 求较大的两个数之和
  • 4. 1.4 描述行为
  • 5. 1.5 applicative order vs normal order

1 1.1 求值

2 1.2 前缀形式转换

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) 3 (- 6 2) (- 2 7))

我的做法是从内到外开始写的

3 1.3 求较大的两个数之和

(define (f x y z)
  (cond ((and (<= x y)(<= x z))(+ y z))
       ((and (<= y x)(<= y z)) (+ x z))
       (else (+ x y))
   )
)

注意必须要加=号,否则当x=y=3, z=6会执行x+y

4 1.4 描述行为

当b大于0 得到- 即为 a-b
否则 a+b

5 1.5 applicative order vs normal order

applicative order:
(test 0 (p))
(test 0 (p))
一直无限循环下去

normal order:
(test 0 (p))
(if (= 0 0)
0
(p))
因为0等于0,所以不会执行(p)

Author: lexnewgate

Created: 2016-01-02 周六 01:58

Emacs 24.5.1 (Org mode 8.2.10)

Validate

时间: 2024-10-09 20:08:16

sicp 习题(1)的相关文章

SICP 习题 (1.46)解题总结

SICP 习题 1.46 要求我们写一个过程iterative-improve,它以两个过程为参数,其中一个参数用来检测猜测是否足够好,另一个参数用来改进猜测.过程iterative-improve应该返回另一个过程,所返回的过程接收一个参数作为初始猜测,然后不断改进猜测直到结果足够好.题目还要求我们使用iterative-improve重写1.1.7的sqrt过程和1.3.3节的fixed-point过程. 因为涉及到高阶函数,所以整个题目理解起来有一点点费劲.不过这道题作为第一章的收官题确实

SICP 习题 (2.26)解题总结:列表操作符append cons list

SICP  习题 2.26 也是不需要太多解释的题目, 题目的主要目的是让读者理解append cons list三个操作的差别. 直接运行下面代码中的start-test-2-26过程就可以了,需要留意一下的是append 过程, cons过程和list过程的使用. 最好翻一下mit-schme的参考手册,对了,一直没有提mit-scheme的手册,建议大家去下载一份备用,需要的时候查一查 链接如下: http://www.gnu.org/software/mit-scheme/ 有pdf版可

SICP 习题 (2.16)解题总结:避免误差的区间计算系统

SICP 习题 2.16 问我们能不能设计一个没有问题的区间计算系统,可以避免习题2.14中的问题.题目还吓我们说这可能很难. 这一下就把我吓住了,你不是说很难吗,那就很难吧,我不会.呵呵

SICP 习题 (2.15)解题总结:区间误差的深入思考

SICP 习题 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现问题,这个问题是Lem发现的.接着,一个叫Eva的人也发现了这个问题,同时她还有更深入的思考. Eva觉得,如果一个公式可以写成一种形式,其中具有非准确性的变量不重复出现,那么Alyssa的系统产生的区间的限界会更紧一些. 因此,她觉得在计算并联电阻时,公式"1/(1/R1 + 1/R2)"比公式"(R1*R2)/ (R1 + R2)"要

SICP 习题 (1.45)解题总结

SICP 习题 1.45是对前面很多关于不动点的习题的总结. 题目回顾了我们之前在1.3.3节使用的不动点寻找方法,当寻找y -> x/y 的不动点的时候,这个变换本身不收敛,需要做一次平均阻尼才可以. 对于y -> x/(y^2)这个变换也可以通过一次平均阻尼使它变得收敛. 不过一次平均阻尼对于四次方程是不够的,就是说,对y -> x/(y^3)这样的变换,一次平均阻尼不足以使它收敛,需要做两次平均阻尼才行. 题目遵从一直以来的抽象原则,要求我们去多做几次测试,找出 y -> x

SICP 习题 (2.23)解题总结:for-each的实现

SICP 习题 2.23 要求我们实现一个for-each过程. for-each过程和map过程其实很像,只不过for-each过程不返回值,如果返回一个值的话也是不包含意义的值. map比较像一个加工厂,进去一堆东西,加工一下,出来另一堆东西. for-each更像一个蒸汽机,进去一堆煤,燃烧一下,产生能量干点活,不出来东西,真的一定要说有东西出来也是煤渣,大家不在乎的东西. 所以for-each更关注的是里面执行的操作. 其实for-each操作在我们日常使用的语言中都会有,如c语言里的f

SICP 习题 (2.21)解题总结: map的使用

SICP 习题 2.21 开始引入了map,准确来讲,是这道题目前的文章内容开始引入了map. 为了完成本习题,甚至说为了完成本文以后的阅读,请读者一定要理解清楚map的概念,正如书中所说,"map是一种很重要的结构,不仅因为它代表了一种公共模式,而且因为它建立起了一种处理表的高层抽象". 虽然说得非常高大上,但是map的概念理解起来并不困难,最基本的理解就是给你一组东西,你对这组东西执行map操作的话,就是把这组东西里面的成员逐个拿出来执行对应操作. 比如(map  做朋友  土豪们

SICP 习题 (2.10)解题总结: 区间除法中除于零的问题

SICP 习题 2.10 要求我们处理区间除法运算中除于零的问题. 题中讲到一个专业程序员Ben Bitdiddle看了Alyssa的工作后提出了除于零的问题,大家留意一下这个叫Ben的人,后面会不断出现这个人,只要是这个人提到的事情一般是对的,他的角色定位是个计算机牛人,不过是办公室经常能看到的那种牛人,后面还有更牛的. 对于区间运算的除于零的问题,处理起来也比较简单,只需要判断除数是不是为零,除数为零就报错.对于一个区间来讲,所谓为零就是这个区间横跨0,再直接一点讲就是起点是负数,终点是正数

SICP 习题 (2.9)解题总结:区间的宽度和区间加减乘除的关系

SICP 习题 2.9 像是一个数学题,要我们证明区间的和与差的宽度是被加和被减的区间的宽度的函数,而对于乘法和除法来说不成立. 书中所谓宽度就是区间起点和终点差的一半,以我看来更像是区间宽度的一半,不管怎么样,差不多是一个意思.如果你把区间看成是一个线段的话,所谓宽度应该就是起点和终点的差,如果一定要把宽度的一半记作是宽度也无所谓的. 证明区间的和的宽度是被加区间的宽度的函数这一点是比较容易证明的,看下面的证明步骤: 如果有区间1是(a1 b1),还有区间2是(a2 b2), 那么区间1的宽度

SICP 习题 (2.7) 解题总结 : 定义区间数据结构

SICP 习题 2.7 开始属于扩展练习,可以考虑不做,对后面的学习没什么影响.不过,如果上面的使用过程表示序对,还有丘奇计数你都可以理解的话,完成这些扩展练习其实没什么问题. 习题2.7是要求我们协助Allysa完成interval的定义. Allysa定义了下面的过程来创建一个区间(interval),其中a是起点(就是较小的部分),而b是终点(就是较大部分). (define (make-interval a b) (cons a b)) 题目要求我们实现lower-bound过程和upp