2005/04/17

reverseもどきで一番頭が痛かったのは、与えられたリストの car をそのまま末尾に cons すると proper なリストにならないことだ。つまり、(1 2 3 4 5) => (5 4 3 2 . 1) になってしまう。そこで、今朝までのバージョンでは、まず最初にリストの car をリストにする処理を行っていた。(1 2 3 4 5) => ((1) 2 3 4 5) みたいにしておけば、((1) 2 3 4 5) => (5 4 3 2 1) が得られるという仕組み。これが気持悪い。そこで、名前付き let を工夫して、最初だけ空リストを頭にくっつけられるようにしてみた。この方法なら、本来の処理で cons が1つ減るというおまけ付き。

(define rvs
(lambda (ls)
(let fishy-rvs ((rvsed '()) (amari ls))
(if (null? amari)
rvsed
(fishy-rvs
(cons (car amari) rvsed)
(cdr amari))))))

だいぶいい線にたどりついたんじゃないかな。

0 件のコメント: