Shammer's Philosophy

My private adversaria

Lisp 再帰処理の失敗

Lisp でプログラムを書いていると、再帰処理でリスト要素がなくなった場合のチェックを忘れてうまく動作しないことがある。

(defun ng-recursive-func (object lst)
  (if (eql object (car lst))
      lst
    (ng-recursive-func object (cdr lst))))

これを動作させると、応答が返ってこなくなる。正しくは、以下のようにすべき。

? (defun ok-recursive-func (object lst)
  (if (null (car lst))
      (format t "NONE.~%")
    (if (eql object (car lst))
	lst
      (ok-recursive-func object (cdr lst)))))
OK-RECURSIVE-FUNC
? (ok-recursive-func 0 (list 1 2 3))
NONE.
NIL
? (ok-recursive-func 1 (list 3 2 1))
(1)
? (ok-recursive-func 1 (list 1 2 3))
(1 2 3)

再帰関数を書く場合は、null のチェックを忘れないようにしないといけない。