SICP ex2-1 modified rational arithmetic

来源:互联网 发布:php curl 多线程采集 编辑:程序博客网 时间:2024/05/04 19:17

经过十多天煎熬,本宝宝终于顺利进入第二章,傲娇脸

首先,本章章首简要回顾了上一章的基本内容以及总体概述了data abstraction 的原因重要性,以及介绍了本章将会学习的一些东西

2.1.1通过一个rational arithmetic的例子来引出data abstraction 并且介绍基础pair 语法

ex2-1要求修改书中所给的make-rat使之能够在给定参数为-时,将符号放在分子出输出,两种思路

一 修改gcd 使之能够处理负数

二 利用abs 将gcd 参数约束为正数,并保留原先符号,在结果出进行修正

我们由于比较懒,所以选择第二种方式

以下为代码

(define (Gcd a b)(define (reminder x y) (if (< x y) x (reminder (- x y) y)))(if (= b 0)  a  (Gcd b (reminder a b))))(define (make-rat n d)(let ((g (Gcd (abs n) (abs d)))(symbol ((lambda (a b) (cond ((< (* a b) 0) -1)((> (* a b) 0) 1)((= a 0) 0))) n d)))(cons (* symbol (abs (/ n g))) (abs (/ d g)))))(define (rat+ x y)(/ (+ (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))(define (rat* x y)(/ (* (car x) (car y)) (* (cdr x) (cdr y))))(define (rat/ x y)(/ (* (car x) (cdr y)) (* (cdr x) (car y))))(define (rat- x y)(/ (- (* (car x) (cdr y)) (* (car y) (cdr x))) (* (cdr x) (cdr y))))(define (rat= x y)(= (* (car x) (cdr y)) (* (car y) (cdr x))))(define (print-rat x)(newline)(display (car x))(display "/")(display (cdr x))0)

0 0
原创粉丝点击