zoukankan      html  css  js  c++  java
  • 【SICP练习】102 练习2.79-2.80

    练习2-79

    首先需要加载第125页的apply-generic函数,然后添加题中要求的通用型操作equ?。

    (define (equ? x y)
    (apply-generic ‘equ? x y))

    题目要求我们能够处理常规的数、有理数和复数。分别列出如下。

    常规数:

    (define (install-scheme-number-package)
        (define (tag x)
            (attach-tag 'scheme-number x))
        (put 'make 'scheme-number
            (lambda (x)
                (tag x))) 
        (put 'equ? '(scheme-number scheme-number)
            (lambda (x y)
                (= x y)))
    'done)
    
    (define (make-scheme-number n)
    ((get 'make 'scheme-number) n))
    

    有理数:

    define (install-rational-package)  
        (define (numer x)
            (car x))
        (define (denom x)
            (cdr x))
        (define (make-rat n d)
            (let ((g (gcd n d)))
                (cons (/ n g) (/ d g))))
        (define (tag x)
            (attach-tag 'rational x))
        (put 'make 'rational
            (lambda (n d)
                (tag (make-rat n d))))
        (put 'equ? '(rational rational)
            (lambda (x y)
                (and (= (numer x) (numer y))
                     (= (denom x) (denom y)))))
    'done)
    
    (define (make-rational n d)
        ((get 'make 'rational) n d))
    

    复数:

    (define (install-complex-package)
        (define (make-from-real-imag x y)
            ((get 'make-from-real-imag 'rectangular) x y))
        (define (make-from-mag-ang r a)
            ((get 'make-from-mag-ang 'polar) r a))
        (define (tag z)
            (attach-tag 'complex z))
        (put 'make-from-real-imag 'complex
            (lambda (x y)
                (tag (make-from-real-imag x y))))
        (put 'make-from-mag-ang 'complex
            (lambda (r a)
                (tag (make-from-mag-ang r a))))    
        (put 'equ? '(complex complex)
            (lambda (x y)
                (and (= (real-part x) (real-part y))
                     (= (imag-part x) (imag-part y)))))
    'done)
    (define (make-complex-from-real-imag x y)
        ((get 'make-from-real-imag 'complex) x y))
    (define (make-complex-from-mag-ang r a)
    ((get 'make-from-mag-ang 'complex) r a))
    

    练习2-80

    和上一题一样,先加载第125页的apply-generic函数,然后添加题中要求的通用型操作=zero?。

    (define (=zero? x)
    (apply-generic ‘=zero? x))

    常规数:

    (define (install-scheme-number-package)
        (define (tag x)
            (attach-tag 'scheme-number x))
        (put 'make 'scheme-number
            (lambda (x)
                (tag x))) 
        (put '=zero? '(scheme-number)
            (lambda (value)
                (= value 0)))
    'done)
    (define (make-scheme-number n)
    ((get 'make 'scheme-number) n))
    

    有理数:

    (define (install-rational-package)
        (define (numer x)
            (car x))
        (define (denom x)
            (cdr x))
        (define (make-rat n d)
            (let ((g (gcd n d)))
                (cons (/ n g) (/ d g))))
        (define (tag x) 
            (attach-tag 'rational x))
        (put 'make 'rational
            (lambda (n d)
                (tag (make-rat n d)))) 
        (put '=zero? '(rational)
            (lambda (r)
                (= 0 (numer r))))
    'done)
    (define (make-rational n d)
        ((get 'make 'rational) n d))
    

    复数:

    (define (install-complex-package)
        (define (make-from-real-imag x y)
            ((get 'make-from-real-imag 'rectangular) x y))
        (define (make-from-mag-ang r a)
            ((get 'make-from-mag-ang 'polar) r a))
        (define (tag z)
            (attach-tag 'complex z))
        (put 'make-from-real-imag 'complex
            (lambda (x y)
                (tag (make-from-real-imag x y))))
        (put 'make-from-mag-ang 'complex
            (lambda (r a)
                (tag (make-from-mag-ang r a)))) 
        (put '=zero? '(complex)
            (lambda (c)
                (and (= 0 (real-part c))
                     (= 0 (imag-part c)))))
    'done)
    (define (make-complex-from-real-imag x y)
        ((get 'make-from-real-imag 'complex) x y))
    (define (make-complex-from-mag-ang r a)
    ((get 'make-from-mag-ang 'complex) r a))
    
    



    感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


    为使本文得到斧正和提问,转载请注明出处:
    http://blog.csdn.net/nomasp


    版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

  • 相关阅读:
    html实现滚动播报(原生JS实现)
    移动端H5页面惯性滑动监听
    简单线条、任意填充色的小图标(含自制方法)
    git和github新手安装使用教程(三步入门)
    node.js的安装配置——前端的配置
    Sublime Text 3 一些简单使用
    $.ajax() 方法的理解
    前端知识点
    (6)一些工作和生活的经验分享,以后还会不断补充添加
    (5.1)Opencv库学习第二部分
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4786117.html
Copyright © 2011-2022 走看看