前のエントリーでやっていることを CLOS の「補助メソッド」で。しかし、こうもシンプルに書けてしまうと、なんだか、f をありのまま定義して手つかずにすることへの脱力感が際だちますね(^_^;)。
(defmethod f ((n integer)) (cond ((= n 1) 1) ((evenp n) (f (/ n 2))) ((oddp n) (f (+ (* 3 n) 1))))) (defmethod f :before ((n integer)) (setq steps (1+ steps)) (setq upto (max upto n))) (defmethod g ((n integer)) (setq steps 0) (setq upto n) (f n) (list steps upto)) (defmethod h ((n integer)) (let ((result (list 0 0 n))) (dotimes (k (1+ n) result) (if (zerop k) T (let ((curr (g k))) (if (< (cadr result) (car curr)) (setq result (cons k curr)))))))))
(h 100) ;;=> (97 119 9232)
参考文献: