2012年6月8日金曜日

lispについて

lispについて

関数名:memaa、引数名:lstとしてリストlstの要素にaというアトムが”2つ以上”含まれるときに真(T)を値として返す関数を定義せよ。ただしリストはアトムだけを要素としてもつリストとする。

例:

(memaa '(a)) > NIL

(memaa '(a a)) > T

(memaa '(x a z)) > NIL



この問を解いてみたのですが、アトムaが”一つ以上”含まれる条件の関数しか定義できません。

and関数を使うのだろうかと予想はしてみたものの使い方がうまくわからず手が止まってしまいました。

誰か心やさしい方教えてください。

以下がプログラムソースです。



----------------------

(defun memaa (lst)

__(cond ((null lst) NIL)

____________((eq (car lst) 'a) T)

____________(T (memaa (cdr lst)))

__)

)

----------------------







上のコードを元に考えると, 「1つでも 'a を発見したか?」という状態を保持する必要があるため,



(defun memma (lst)

(defun rec (is_one lst)

(cond ((null lst) NIL)

((and is_one (equal 'a (car lst))) T)

((equal 'a (car lst)) (rec T (cdr lst)))

(T (rec is_one (cdr lst)))

))

(rec NIL lst))



と is_one に T なら1つ見つけた,NIL なら一つも発見していないという意味を持たせれば記述できます.



また,別の方法として,'a の数をカウントする関数を定義して,カウントした結果が2以上なら,T する方法もあります.その方法は以下のように書けます.



(defun counts (a lst)

(cond ((null lst) 0)

(T (+ (if (equal a (car lst)) 1 0) (counts a (cdr lst))))))



(defun memma (lst)

(>= (counts 'a lst) 2))

0 件のコメント:

コメントを投稿