5

パラメータとして2つのリストを取り、最初のリストのすべての要素が2番目に含まれているかどうかをチェックする関数を書きたい(要素の順序は関係ありません)。この関数は、2 つのリストが同じ長さ (2 つのリストに重複する要素を含めることはできません) かどうかもチェックします。そうでない場合、関数は nill/false を返すためです。

例: (ABCDEF) と (BEAFDC) は同じ要素を持ちます (nil) と (nil) は同じ要素を持ちます

(ABCDEF) と (ABCDEFG) は同じ要素を持っていません

問題は、私がいくつかの基本的なコマンドしか知らず、それらのコマンドしか使用できないことです。これらは、私が知っているほとんどすべてのコマンドです。

CAR, CDR, LENGTH, NULL, MEMBER, NOT, AND, OR, NOT, MAPCAR, APPLY, DO, SETQ, LET

私は今まで次の関数を書いていましたが、重複メンバーをチェックする方法がわからず、チェックしたいすべてのリストに対して適切に機能しません:

(defun same-elem-p (lst1 lst2)
  (cond ((not (null lst1))
         (cond ((member (car lst1) lst2)
                (same-elem-p (cdr lst1) lst2))
               (t nil)))
        (t t))) 

問題を十分に説明したことを願っています。

4

7 に答える 7

1

list1 にマップし、list1 の各要素にマップする関数を作成します。

  1. list2 でそれを見つけます。list2 にない場合、失敗します。
  2. それ以外の場合は list2 から削除します
于 2013-04-02T10:31:22.043 に答える
0
(defun same ( a b )
`(cond
(( null a )'same )
((member(car a ) b ) (same(cdr a ) b ))
(t'nosame )))

(defun entre ( )
(let(( a ) ( b ))
(princ " list a : " ) (setq a (read ))
(princ " list b : " ) (setq b (read ))
(if (= (length a ) (length b )) (same  a b ) 'nosame )))
于 2016-07-22T04:22:48.020 に答える