Lisp---基本有理数类

时间:2022-06-25 10:19:34

题目:构造一个基本的有理数类。


第二章讲的主要是构造数据抽象等问题。在构造一个有理数过程中,用到了面向对象程序设计的思想,把整个有理数封装成为一个类。

之后对有理数的基本操作都可以用这个完成。涵盖了有理数的加减乘除,以及用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))))