Schemeでリストの反転
全然大したことやってませんので、・・・ご忠告までに。
徹夜で履歴書の原案を練っていて、一段落付いたところでブログを見てると、id:higeponさんがSICPの勉強をされていた。そこでリストの反転の問題を解いていたので、自分も今すぐ解けるかどうかやってみた。
gosh> (define (rev list) (define (rev-iter tl rl) (if (null? tl) rl (rev-iter (cdr tl) (cons (car tl) rl) ) ) ) (rev-iter list () ) ) rev gosh>(rev '(1 2 3 4 5)) (5 4 3 2 1)
成功なのかな。まぁ、いいや。気分転換です。( tl は残りで、rl はすでに反転済み)
ちなみに、Prologがわかる大学の友達に言っておくと、
Prologにおいて、あるリスト(= list)を [ H | TL ] と表現するとき
- H <-> (car list)
- TL <-> (cdr list)
- [ H | TL ] <-> (cons h tl)
という風に対応します。だから、後は関数の中に関数を定義しているだけなので、Prologの知識と考え方を思い出せば理解できると思います。*1
ふわぁ・・・、眠い・・・。
*1:あと、if文は " (if (条件) (真のとき) (偽のとき) ) " で、関数定義は、 " (define (関数名 引数) ... (返り値) ) "