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の部分もガード句みたなもんだ(ちょっと違う気がするけど)。
もっともっと難しいのが今後出てくるのかな。