simply scheme 第十二章 练习

<!-- @page { margin: 2cm } PRE.western { font-family: "DejaVu Sans Mono", monospace } PRE.cjk { font-family: "AR PL UKai CN", monospace } PRE.ctl { font-family: "DejaVu Sans Mono", monospace } P { margin-bottom: 0.21cm } -->

12.1

(define (addup nums)

  (if (empty? nums)

      0

      (+ (first nums)(addup (bf nums)))))

12.2

(define (acronym sent)

  (if(=(count sent) 1)

     (first(first sent))

     (word(first(first sent))

          (acronym(bf sent)))))

12.3

no if do that n!==0

12.4

(define (f sent)

  (if(empty? sent)

     '()

     (se (f (bf sent))(first sent))))

reverse the sentence

12.5

(define (exaggerate sent)

  (if(empty? sent)

     '()

     (se ((lambda(wd)(if(number? wd)(* 2 wd) wd))(first sent))

         (e(bf sent)))))

12.6

(define (gpa sent)

  (/ (gpa-c sent) (count sent)))

(define (gpa-c sent)

  (if(empty? sent)

     0

     (+ (gpa-m (first sent))

        (gpa-p (first sent))

        (gpa-c (bf sent)))))


(define (gpa-m wd)

  (cond((equal? (first wd) 'a) 4)

       ((equal? (first wd) 'b) 3)

       ((equal? (first wd) 'c) 2)

       ((equal? (first wd) 'd) 1)

       ((equal? (first wd) 'f) 0)))


(define (gpa-p wd)

  (cond((equal? (last wd) '+)0.33)

       ((equal? (last wd) '-)-0.33)

       (else 0)))

12.7

(define (spell-number num)

  (if(empty? num)

     '()

     (se (spell-digit(first num))(spell-number (bf num)))))

(define (spell-digit digit)

  (item (+ 1 digit)

        '(zero one two three four five six seven eight nine ten)))

12.8

(define (numbers sent)

  (if(empty? sent)

     '()

     (se ((lambda(x)(if(number? x)x '()))(first sent))

          (numbers (bf sent)))))

12.9

(define (real wd)

  (not (member? wd '(a the an in of and for to with))))

(define (real-word sent)

  (if(empty? sent)

     '()

     (se ((lambda(wd)(if(real wd)wd '()))(first sent))

          (real-word (bf sent)))))

12.10

(define (remove wd sent)

  (if(empty? sent)

     '()

     (se ((lambda(w)(if(equal? w wd)'() w))(first sent))

         (remove wd (bf sent)))))

12.11

(define (count x)

  (if(empty? x)

     0

     (+ 1 (count (bf x)))))

12.12

(define (roman-value letter)

  (cond((equal? letter 'i)1)

       ((equal? letter 'v)5)

       ((equal? letter 'x)10)

       ((equal? letter 'l)50)

       ((equal? letter 'c)100)

       ((equal? letter 'd)500)

       ((equal? letter 'm)1000)))

(define (a wd)

  (if(=(count wd)1)

     (roman-value wd)

     (+ ((lambda(w)

           (if(< (roman-value (first w))

                 (roman-value (first(bf w))))

              (- (roman-value (first w)))

              (roman-value(first w))))

         wd)

        (a (bf wd)))))

12.13

can't

posted on 2010-07-12 11:02  草头菜  阅读(103)  评论(0编辑  收藏  举报

导航