01-程序设计的基本元素-习题

1.2
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))
—————————————————————————————————————————————————————————————————————————————————
1.3 定义一个过程,以三个数为参数,返回其中较大的两个数的和
(1)定义一个过程,以两个数为参数,返回较大的那个 //问题是:两者相等,应该返回谁?还是-1
//(define (max x y) (cond ((> x y) x) ((< x y) y) (else -1))
(define (max x y) (if (> x y) x y))
(2)定义一个过程,以三个数为参数,返回较大的那一个
(define (maxs x y z) (max (max x y) z))
(3)如何求出三个数中,较大的两个数?

逆向思维:可以求出三个数中较小的那个
(1)定义一个过程,以两个数为参数,返回较小的那个
(define (min x y) (if (< x y) x y))
(2)定义一个过程,以三个数为参数,返回最小的那个
(define (mins x y z) (min (min x y) z) )
(3)较大的两个数的和 = 三个数的和 - 最小的数
(define (sum-two-max x y z) (- (+ x y z) (mins x y z) ) )

例子:
(sum-two-max 9 2 6)
(- (+ 9 2 6) (mins 9 2 6))
(- 17 (min (min 9 2) 6))
(- 17 (min 2 6))
(- 17 2)
15
—————————————————————————————————————————————————————————————————————————————————
1.4 允许运算符为复合表达式的组合式的求值模型,描述下面过程的行为:
(define (a-plus-abs-b a b) ((if (> b 0) + -) a b)
描述:
if (b >0) return +
else return -
—————————————————————————————————————————————————————————————————————————————————
1.5
(1)应用序:先求值参数而后归约
正则序:完全展开后,再归约
(2)例子:
(define (square x) (* x x))
(define (sum-squares x y) (+ (square x) (square y) ))
(i)正则序求值:
a.完全展开:
(sum-squares (+ 5 1) (* 5 2))
(+ (square (+ 5 1)) (square (* 5 2)))
(+ (* (+ 5 1) (+ 5 1)) (* (* 5 2) (* 5 2) ) )
b.然后进行归约:
(+ (* 6 6) (* 10 10) )
(+ 36 100)
136
(ii)应用序求值:
(sum-squares (+ 5 1) (* 5 2) )
(sum-squares 6 10)
(+ (square 6) (square 10))
(+ (* 6 6) (* 10 10))
(+ 36 100)
136
(3)定义以下两个过程:
(define (p) (p))
(define (test x y) (if (= x 0) 0 y))
然后求值下面的表达式:
(test 0 (p))

(i)正则序求值:
(test 0 (p))
(if (= 0 0) 0 (p))
0
(ii)应用序求值:
(test 0 (p))
(test 0 (p))
(if (= 0 0) 0 (p))
0
问题是:以上解答错在哪里???

posted on 2016-10-16 15:08  桃枝妖妖  阅读(144)  评论(0编辑  收藏  举报

导航