我的SICP习题答案(1.1~1.5)

我的SICP习题答案(1.1~1.5)

1.1

10 , 12 , 8 , 3 , 10 6, a , b , 19 , #f , 4 , 16 , 6 , 16

1.2


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

or

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

1.3

这个问题中文版的翻译是错的,参看原文是求平方和而不是“和”。

(define (square(x)(* x x)))
(define (max x y)(if (< x y) y x))
(define (func x y z)
  (+ (square (max x y))
     (square (max (min x y) z))))

1.4

a+|b| 

<=>

1  #  in python
2  def  a_plus_abs_b(a,b):
3       if  b > 0 :
4          x  =  a  +  b
5       else :
6          x  =  a  -  b
7       return  x

1.5

在网上看了很多答案,都认为“应用序”的实现会导致死循环,我非常困惑。反复看了中文版和英文版,觉得大家这样认为可能是书中说lisp的实现是“应用序”,而在scheme中跑这段代码会死循环,就先入为主的认为“应用序”的实现会死循环。其实对照正文,我们可以看到“正则序”停止展开的条件是“只包含基本运算符的表达式”,而对于

(define (p) (p))

是无论如何也没法完全展开的,因为它会不断递归,所以“正则序”才会死循环。

而对于“应用序”的实现,则会这样展开


(test 0 (p))
(if (= 0 0) 0 (p))
(if #t 0 (p))

; 0

解决这个问题主要是“正则序”(Normal order)以及“应用序”(Applicative order)展开一个组合式的规则,仔细研究了MIT 6.001课程讲义,网上的各种答案,以及中英文版。我认为,正则序以类似广度优先的方式进行展开。而应用序优先计算子表达式,类似与深度优先。那么对于这个问题,
正则序 会展开为
= > (if ( =   0   0 0  (p))
= > (if #t  0  (p))
接着,由于这是一个if的special form(特殊形式),就会被展开为
0
而应用序,由于(p)一直可以递归代换,从一开始就会进入一个无限递归中去。
简言之,由于应用序的原因,在 test 表达式 还没有展开为 if 特殊形式(special forms)时, (p)已经陷入了无限递归。

你可能感兴趣的:(我的SICP习题答案(1.1~1.5))