(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

rember--Scheme手習い

ということで再帰ってすげぇなぁと思いながら難しいなぁと実感。
Javaに関する技術書には、わざわざ再帰について書いてないので結構再帰という概念を使ったことのないJavaプログラマっているんじゃないのかなぁと思ってます。まぁ僕です。

さて、今日のプログラムは…Scheme手習いよりrember。
(rember -- remove a member.)

(define (rember a lat)
  (cond
   ((null? lat) '())
   (else (cond
	  ((eq? a (car lat))(cdr lat))
	  (else
	   (cons (car lat)(rember a (cdr lat))))))))

こんな感じ。
定義としてremberはアトムaとリストlatを引数にとり、latの中で一番初めに一致したアトムを除外したリストを返す。らしい。

でも、これだと煩雑というかLISP(Scheme?)の良さを活かせている感じがしないので最適化をしてみる。
昨日書いたcondに関しての記事を読み返すとなんとなく分かる気がするけど。
condは一致した条件の値を返します。なので、

(else (cond

の部分は冗長ですね。

((null? lat) '())

が先に評価されて真であれば

((eq? a (car lat))(cdr lat))

が評価されることはないはずなので、以下のようになる…はず!

(define (rember a lat)
  (cond
   ((null? lat) '())
   ((eq? a (car lat))(cdr lat))
   (else
    (cons (car lat)(rember a (cdr lat))))))

これで良し…かな?
再帰を考えながらプログラムするって難しいですね。
これは慣れるしかないのか…。