• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
String Of Brilliant Blue
湛蓝之弦
博客园    首页    新随笔    联系   管理     

sicp练习题

lisp学习

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

 

posted @ 2010-03-16 13:13  effulgent  阅读(500)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3