题目:构造一个基本的有理数类。
第二章讲的主要是构造数据抽象等问题。在构造一个有理数过程中,用到了面向对象程序设计的思想,把整个有理数封装成为一个类。
之后对有理数的基本操作都可以用这个完成。涵盖了有理数的加减乘除,以及用GCD确保有理数是最简分数。
新接触的(define x (cons a b))可以简单的理解为pair<int int> x , 取出里面的元素a= (car x), b= (cdr x), 可以类比为x.first, x.second。
同样可以在cons里套cons,例如(cons (cons a b) c) ,类似于make_pair(make_pair (a,b), c);
构造一个类的思想和C的思想是基本一致的,在一开始想有理数的所有构成元素并由最主要的几个函数
1.构造函数
2.具体实现(成员函数)等等
以下代码:
> (define (make-rat a b) (cons a b)) > (define (numer x) (car x)) > (define (denom x) (cdr x)) //以上为普通有理数定义,但是不能约分到最简比例。 //以下段为优化的有理数定义(构造函数) > (define (make-rat a b) (let ((m (gcd-rat a b))) //定义最简分数 (cons (/ a m) (/ b m)))) > (define (numer x) (car x)) //定义分子 > (define (denom x) (cdr x)) //定义分母 //有理数以分数形式输出 > (define (print-rat x) (display (numer x)) (display "/") (display (denom x))) //有理数的加减乘除 > (define (add-rat x y) (make-rat (+ (* (numer x) (denom y)) (* (denom x) (numer y))) (* (denom x) (denom y)))) > (define (sub-rat x y) (make-rat (- (* (numer x) (denom y)) (* (denom x) (numer y))) (* (denom x) (denom y)))) > (define (mult-rat x y) (make-rat (* (numer x) (numer y)) (* (denom x) (denom y)))) > (define (div-rat x y) (make-rat (* (numer x) (denom y)) (* (denom x) (numer y)))) //之前化简过程所用的gcd函数用迭代,欧几里得算法(辗转相除法)实现 > (define (gcd-rat x y) (gcd-iter x y)) > (define (gcd-iter x y) (if (= y 0) x (gcd-iter y (mod x y))))