Lispプログラミング 第2回


第7章 再帰的な関数の定義例

☆例題1:
次の帰納的定義の形で表された数列の第n項の値を求める命令を作りなさい。
=1, a=3an-1+2 (n≧2)
解答1
->(defun a (n)
      (cond ((= n 1) 1)
            ( t     (+ (* 3 (a (1- n))) 2))
      ))

->(list (a 1) (a 2) (a 3) (a 4) (a 5))
->(a 50)
☆例題2:
システム関数maxを使わずに、与えられた数字のリスト(N N N ...)の最大値を求める関数maximumを作りなさい。
使い方: ->(maximum '(3 4 7 2 5 8))
結 果: 8
解答2
 
与えられたリストxの各要素を x,xn-1,...,x で表わします。この時、
s=x s=x[si-1≦xの時] または si-1[si-1>xの時] .....(i≧2)
で定義される数列の第n項 s は、(maximum X) の値となっています。
この例題で問題になるのは終了条件で、n=1という条件式の代わりに、「リストの要素が1つか」ということを (null (cdr X))でチェックします。
->(defun maximum (X)
      (cond ((null (cdr X)) (car X))
            ((<= (maximum (cdr x)) (car X))
             (car X))
            (t  (maximum (cdr X)))
      ))

演習1 演習2 演習3 演習4 演習5