effulgent

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)))

 

分类:

技术点:

相关文章: