SICP section 1.1

1.5 Ben Bitdiddle发明了一种检测解释器究竟采用哪种顺序求值的方法,应用序还是正则序:

 

(define (p y) (p y)) (define (test x y) (if (= x 0) 0 y)) (test 0 (p 1)) 

上面的过程p,我稍稍做了修改,因为我的解释器(DrScheme)不能够定义没有参数的过程,下面解释这如何根据表达式:

 

(test 0 (p 1))

 

的结果,判断解释器的求值顺序。


 

如果解释器采用正则序,那么(test 0 (p 1))执行过程是:

 

;;;先把表达式展开如下: (if (= 0 0) 0 (p 1)) ;;;此时对于if表达式先计算谓词部分即 (= 0 0) ;;;由于此时谓词问真,所以该表达式取值为0. 

 

如果解释器采用应用顺序,表达式执行过程为:

 

;;;先对表达式的各个参数进行求值,第一个参数为: 0 ;;;然后求第二个参数: (p 1) ;;;由于过程p是对自身的递归调用,且没有结束条件,所以该表达式将永远进行下去(如果没有外界干扰的话)。 

 

练习1.11 

 

(1)采用递归计算f的过程为:

(define (f n) (if (< n 3) n (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3))))))  

(2)采用迭代计算过程:

(define (f n) (if (< n 3) n (f-iter 2 1 0 (- n 2)))) (define (f-iter f_n1 f_n2 f_n3 count) (if (= count 0) f_n1 (f-iter (+ f_n1 (* 2 f_n2) (* 3 f_n3)) f_n1 f_n2 (- count 1)))) 

你可能感兴趣的:(SICP section 1.1)