練習問題の解答 : リスト構造(簡単なリスト操作)


1.
普通の再帰(int-gen)と末尾再帰(int-gen2) 二つ作ってみました。 良かったら、STEP機能でも使って挙動を追ってみると良いでしょう。
(define (int-gen n m)
  (if (> n m)
      (list)
      (cons n (int-gen (+ n 1) m))))

(define (int-gen2-iter n m result)
  (if (> n m)
      result
      (int-gen2-iter n (- m 1) (cons m result))))

(define (int-gen2 n m)
  (int-gen2-iter n m (list)))

(int-gen 3 10)
(int-gen2 3 10)
2.
こちらも 2 種類作ってみました。再帰的に int-list-operator を呼ぶタイプと、 はじめだけ場合分けして、sumup-list, product-list を呼ぶタイプ。
(define (int-list-operator expr keyword)
  (if (null? expr)
      (cond ((eq? keyword 'sum) 0)
            ((eq? keyword 'product) 1))
      (cond ((eq? keyword 'sum)
             (+ (car expr)
                (int-list-operator (cdr expr) keyword)))
            ((eq? keyword 'product)
             (* (car expr)
                (int-list-operator (cdr expr) keyword))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define (int-list-operator2 expr keyword)
  (cond ((eq? keyword 'sum) (sumup-list expr))
        ((eq? keyword 'product) (product-list expr))))

(define (sumup-list expr)
  (if (null? expr)
      0
      (+ (car expr) (sumup-list (cdr expr)))))

(define (product-list expr)
  (product-list-iter expr 1))
(define (product-list-iter expr result)
  (if (null? expr)
      result
      (product-list-iter (cdr expr) (* result (car expr)))))
実は、もうちょっとあとで、こんな事も出来る事を教えます。
(define (int-list-operator3 expr keyword)
  (cond ((eq? keyword 'sum) (apply + expr))
        ((eq? keyword 'product) (apply * expr))))

解答例


99.10.5/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp