計算機プログラムの構造と解釈 第二版 P49 問題2.2
この問題とてもいい問題だと僕は思うのです。
日本語が難しいですが、
文章を読んで、図をイメージする力も大切だと、
世間では言いますし。
求めるのは、こんな感じになるのかな。
- 構成子: make-segment
- 選択子: start-segment
- 選択子: end-segment
と
- 構成子: make-point
- 選択子: x-point
- 選択子: y-point
と
- make-segmentの中間点を返す手続き: midpoint-segment
をつくる。
そんで、出力する手続き
porint-point
にパラメータとして与えてちゃんとできているか確かめるという内容です。
長いな。
そもそも直線って、2点からなってます。
↓ここ(end-segment) ・----------------------------・ ↑ここ(start-segment)
こういう直線を作るのがmake-segment
んで、start-segmentとend-segmentが何からできてるかって、
「ある点」ではあるんだけど、X軸Y軸がある二次元の空間だと
|Y軸 | | | ・ある点(x,y) | ---+--------------------------------- | X軸 | | |
て表現ができる。
これが、make-point
mid-pointはある二点間の中間地点をとればよろし。
ということで、実装
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (define (print-point p) (display "(") (display (x-point p)) (display ",") (display (y-point p)) (display ")") (newline)) (define (make-segment s e) (cons s e)) (define (start-segment x) (car x)) (define (end-segment x) (cdr x)) (define (make-point x y) (cons x y)) (define (x-point x) (car x)) (define (y-point y) (cdr y)) (define (midpoint-segment l) (make-point (/ (+ (x-point (start-segment l)) (x-point (end-segment l))) 2) (/ (+ (y-point (start-segment l)) (y-point (end-segment l))) 2))) ;; main (define (main args) (display "始点(x=1, y=7) ")(newline) (display "終点(x=3, y=1) の中間点は?")(newline) (print-point (midpoint-segment (make-segment (make-point 1 7) (make-point 3 1)))) 0)
実行
始点(x=1, y=7) 終点(x=3, y=1) の中間点は? (2,4)
OKとおもう。