(defun samesetp (list1 list2)
(cond
((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1))))
)
)
まずはそれを正しくフォーマットしてみましょう:
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
((eq list2 (remove (car list1) list2 :count 1)) nil)
(t (samesetP (cdr list1) (remove (car list1) list2 :count 1)))))
あなたは二度のフォームを使用していて、それを変更したい場合は、あなたが値を格納する必要があります。 LETはそのための構成です。 1つのCONDに収まらない場合は、2つ目のCONDが必要です。
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
(t (let ((list3 (remove (car list1) list2 :count 1)))
(cond ((eq list2 list3) nil)
(t (samesetP (cdr list1) list3)))))))
ここで、EQを使用してリストを比較することはできません。等号を使用してください。
(defun samesetp (list1 list2)
(cond ((null list1) (null list2))
(t (let ((list3 (remove (car list1) list2 :count 1)))
(cond ((equal list2 list3) nil)
(t (samesetP (cdr list1) list3)))))))
CONDは場合に使用します、ここで過剰です:
(defun samesetp (list1 list2)
(if (null list1)
(null list2)
(let ((list3 (remove (car list1) list2 :count 1)))
(if (equal list2 list3)
nil
(samesetP (cdr list1) list3)))))
今、あなただけの機能が宿題に頼まれたものを行うようにする必要があります。とにかくあなたの宿題です。
あなたはハッシュテーブルを使用する必要があり、これはOから複雑さをダウンさせるだろう^ 2)をO(n)に変換する。 – leppie
私は混乱しています。あなたはひどいアルゴリズムを使用しており、不正なアルゴリズムを修正する必要がない限り改善が望まれます。どうして? @leppieは言ったように、ハッシュテーブルを使用します。あるいは、両方のリストを並べ替えて並行して歩くこともできます。より良いアルゴリズムは、あなたが関心を持つマイクロ最適化よりもはるかに大きな違いを生み出します。 – btilly
寒い人は、私たちはハッシュテーブルを使用することはできません。宿題の問題の一部です。コードの約10行以内に含まれるより効率的なアルゴリズムについて考えることができるなら、私に教えてください。 –