解答例

■ A4用紙のサイズ

paper-a-size01 は途中に使う関数。
(define paper-a-size01
  (lambda (sl)
    (cons (truncate (/ (cdr sl) 2)) (car sl))))

(define paper-a-size
  (lambda (n)
    (if (= 0 n)
        (cons 841 1189)
        (paper-a-size01 (paper-a-size (- n 1))))))

下記は、途中に使う関数を内部に移したもの。
(define paper-a-size
  (lambda (n)
    (if (= 0 n)
        (cons 841 1189)
        ((lambda (sl)
           (cons (truncate (/ (cdr sl) 2)) (car sl)))
         (paper-a-size-b (- n 1))))))

■ パスカルの三角形

add-next とその改造版の add-next2 を見くらべてみよう。

add-next2 ができれば、pascal-list は簡単だろう。

pascal-list では、cons を使わずに、append を使う方法や、add-next2 を使わずに add-next を使う方法がある。

length を使わずに、null? を使う方法もある。
(define add-next
  (lambda (lst)
    (if (< (length lst) 2)
        (list )
        (cons (+ (car lst) (car (cdr lst))) (add-next (cdr lst))))))

(define add-next2
  (lambda (lst)
    (if (= (length lst) 1)
        lst
        (cons (+ (car lst) (car (cdr lst))) (add-next2 (cdr lst))))))

(define pascal-list
 (lambda (n)
   (if (= 1 n)
       (list 1 1)
       (cons 1 (add-next2 (pascal-list (- n 1)))))))


2006.6.14 by tokuhisa