sicp练习题
1.3
(define (two_min a b)
(if (< a b)
a
b))
(define (three_min x y z)
(if (< (two_min x y) (two_min y z))
(two_min x y)
(two_min y z)))
(define (sum_two_big_num o p q)
(- (+ o p q)
(three_min o p q)))
(sum_two_big_num 9 10 5)
1.5
如何为正则求值则返回0,应用求值则进入死循环
因为(define (p) (p))为无限递归,正则求值会直接返回0,而不会执行(p),应用求值则会先执行(p)而进入死循环,DrScheme为应用求值。
2.1
(define (gcd x y)
(if (= y 0)
x
(gcd y (remainder x y))))
(define (make_rat n d)
(cons n
d))
(define (num rat) (car rat))
(define (den rat) (cdr rat))
(define (add_rat x y)
(make_rat (+ (* (num x) (den y))
(* (num y) (den x)))
(* (den x) (den y))))
(define (simple_rat rat)
(let (
(g (gcd (num rat)
(den rat)))
)
(make_rat (/ (num rat) g)
(/ (den rat) g))
))
(define (_print_rat x)
(newline)
(display (num x))
(display "/")
(display (den x)))
(define (print_rat x)
(if (= (den x) 1)
(display (num x))
(_print_rat x)))
(define (abs_num x)
(if (< x 0)
(- x)
x))
(define (same_sign? a b)
(if (> (* a b) 0)
#t
#f))
(define (make_rat_power n d)
(if (same_sign? n d)
(cons (abs_num n)
(abs_num d))
(cons (- (abs_num n))
(abs_num d))))
(print_rat (make_rat_power 1 4))
(print_rat (make_rat_power 0 -4))
(print_rat (make_rat_power -4 0))
(print_rat (make_rat_power -1 -4))
2.3
(define (make_point x y)
(cons x y))
(define (point_x pt)
(car pt))
(define (point_y pt)
(cdr pt))
;表示1
(define (make_rect x y w h)
(cons (make_point x y)
(make_point w h)))
(define (rect_width rc)
(cdr (car rc)))
(define (rect_height rc)
(cdr (cdr rc)))
(define (rect_x rc)
(car (car rc)))
(define (rect_y rc)
(car (cdr rc)))
(define (rect_lt_point rc)
(make_point (rect_x rc)
(rect_y rc)))
(define (rect_rt_point rc)
(make_point (+ (rect_x rc) (rect_width rc))
(rect_y rc)))
(define (rect_lb_point rc)
(make_point (rect_x rc)
(+ (rect_y rc) (rect_height rc))))
(define (rect_rb_point rc)
(make_point (+ (rect_x rc) (rect_width rc))
(+ (rect_y rc) (rect_height rc))))
;表示2
;以下是计算
(define (rect_area rc)
(* (rect_width rc)
(rect_height rc)))
(define (rect_perimeter rc)
(+ (* (rect_width rc) 2)
(* (rect_height rc) 2)))
(display (rect_area (make_rect 2 5 30 20)))
浙公网安备 33010602011771号