by shigemk2

当面は技術的なことしか書かない

対話によるCommon Lisp入門 35 reverse その2

前回だと、処理する時間が
リストの長さのほぼ2乗に比例した時間がかかる。

なので、末尾再帰を用いて、反転の中間結果をreversed 残りの反転すべき部分リストをlstとして処理したらいいんじゃない?

[1]> (defun reverse$ (lst)
(reverse-loop lst nil))
REVERSE$
[4]> (defun reverse-loop (lst reversed)
(if (null lst) reversed
(reverse-loop (rest lst)
(cons (first lst) reversed))))
REVERSE-LOOP
[5]> (reverse$ '(1 2 3 4))
(4 3 2 1)