Lisp勉強中(7) 再帰

再帰。とりあえず、再帰の勉強でよく出てくる関数を書いてみた。

引数で渡された数の階乗を計算する関数。

(defun fact (n)
  (if (= n 1)
      1
    (* n (fact (- n 1)))))
(fact 10)
=>3628800

引数で渡された数から0までの合計を計算する関数。階乗とほとんど同じ。

(defun sum (n)
  (if (= n 0)
      0
    (+ n (sum (- n 1)))))
(sum 10)
=>55

引数で渡されたリストの要素数を数える関数。cdrを取って再帰呼び出しして、引数がnilになるまで1を加算。

(defun len (l)
  (if (not l)
      0
    (+ 1 (len (cdr l)))))
(len '(a b c d e))
=>5

別に、全然難しくなかった。一般に、再帰は難しいとか、ここでつまずくとか言われるけど、普通の関数呼び出しと変わらない気がする。ただ、他の関数を呼ぶのではなく、たまたま自分だったということ。終了条件のifの部分もガード句みたなもんだ(ちょっと違う気がするけど)。

もっともっと難しいのが今後出てくるのかな。