第一章 构造过程抽象
1.1 程序设计的基本元素
ex 1.1 ~ ex 1.4都比较容易理解,就不写出结果了
EX 1.5
1 | (define (p) (p)) |
求值
(test 0 (P))
分析:
采用应用序,先求参数值再应用, (p)无限递归调用自身,编译器停滞
采用正则序,先展开后规约求值,实参0和(p)不会先求值,解释到if之后,返回0
EX 1.6
1 | (define (new-if predicate then-clause else-clause) |
对于这个程序题中演示的使用
(new-if (= 2 3) 0 5)
(new-if (= 1 1) 0 5)
都是没错的,但若用来重写sqrt程序的话
分析:错误原因是超过递归最大深度
new-if 作为定义的一个过程,由于scheme采用应用序,先求参数值再应用,调用顺序
*sqrt-iter -> new-if -> cond -> sqrt-iter -> new-if -> …… -> * 最终超出栈最大深度
EX 1.7
原始程序
当数字很大时,程序跑不动,当数字很小时,结果错误
修改过程good-enough为
1 | (define (good-enough? guess x) |
对于很大和很小的数字都可以计算平方根
EX 1.8
1 | (define (square x) |