by shigemk2

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

対話によるCommon Lisp入門 27 factorial関数を適当にトレース

(defun factorial (n)
  (if (= n 0) 1
      (* (factorial (- n 1)) n)))

;; (factorial 3)
;; = (* (* (* (factorial 0) n1) n2) n3)
;; = (* (* (* 1 n1) n2) n3)
;; = (* (* (* 1 1) n2) n3)
;; = (* (* 1 2) n3)
;; = (* 2 3)
;; 6

;; [6]> (trace factorial)
;; ;; Tracing function FACTORIAL.
;; (FACTORIAL)
;; [7]> (factorial 3)
;; 1. Trace: (FACTORIAL '3)
;; 2. Trace: (FACTORIAL '2)
;; 3. Trace: (FACTORIAL '1)
;; 4. Trace: (FACTORIAL '0)
;; 4. Trace: FACTORIAL ==> 1
;; 3. Trace: FACTORIAL ==> 1
;; 2. Trace: FACTORIAL ==> 2
;; 1. Trace: FACTORIAL ==> 6
;; 6

追記

なお、上の例だと、n=0のケースが歯止めとなっており、これ以上再帰させないための条件を境界条件という。