私はx(値)とxs(リスト)を取得し、xより大きいすべての値をリストから削除する関数を持っています。うーん、それは動作しません、なぜ教えてくれますか?Lispリストの反復
(defun biggerElems(x xs)
(let ((xst))
(dolist (elem xs)
(if (> x elem)
(setf xst (remove elem xs))))
xst))
私はx(値)とxs(リスト)を取得し、xより大きいすべての値をリストから削除する関数を持っています。うーん、それは動作しません、なぜ教えてくれますか?Lispリストの反復
(defun biggerElems(x xs)
(let ((xst))
(dolist (elem xs)
(if (> x elem)
(setf xst (remove elem xs))))
xst))
私はそれは正しくありません。このラインだと思う:
(setf xst (remove elem xs))))
setf
の最初の引数は、値が続き、場所です。あなたはそれを後方に持っているようです(そしてxst
はnil
か未初期化です)。
あなたはそれが簡単にこれを行うに見つけるかもしれない:
(defun biggerElems (x xs)
(remove-if (lambda (item) (> item x)) xs))
それはそのように働いた:
(defun filterBig (x xs)
(remove-if (lambda (item) (> item x)) xs))
のための '#' 何でしたか?それはそれでコンパイルされませんでした。
「#」は何ですか?それは でコンパイルされませんでした。
Typo。通常は#'
((remove-if #'oddp list)
など)の関数を参照していますが、編集中は '#'を削除するのを忘れていました。あなたはこのLispの道を行いたい場合は
、新しいリストを返すために再帰を使用することができます。
(defun biggerElems (x xs)
(cond ((null xs) NIL)
((< x (car xs))
(biggerElems x (cdr xs)))
(t
(cons (car xs) (biggerElems x (cdr xs))))))
@をルイス・オリヴェイラこのソリューションは、問題の投稿を1と対比することである
。もう少し複雑なことをする必要があったなら、リストを操作する再帰的なアプローチに根ざすことが重要です。
ほとんどの簡潔な私の知る限り:新鮮なリストを返す
(defun bigger-elements (x xs) (remove x xs :test #'<))
、それがために
(< y x)
や有名なLOOP使っXSからyのすべての要素を削除します。
(defun bigger-elements-2 (x xs)
(loop for e in xs
unless (< e x)
collect e))
を@ Ben:それは間違っているsetf呼び出しではありません - 問題は彼がxsを更新していないということです。
ie:xstが削除されたxsに設定されていますが、xsは更新されていません。 2番目の要素が削除される場合、xstはその中に最初の要素を持ちます。
xstをxsにバインドし、remove呼び出しのxsをxstに置き換える必要があります。これにより、xがすべての要素を削除します。すなわち:
(defun biggerElems(x xs)
(let ((xst xs))
(dolist (elem xs)
(when (> x elem)
(setf xst (remove elem xst))))
xst))
それは(コピーリストXS)にXSTを設定するために、わずかに速くなり、その後、削除するのではなく、削除し使用することがあります(削除は、実装に応じ...破壊的である、それは削除よりも速いかもしれません。これを複数回呼び出すので、リストを一度コピーして破壊的に削除する方がパフォーマンスが向上します)。また
:あなたのオリジナルのポストの上に振り返る
(defun bigger-elems (x xs) ; I prefer hyphen separated to camelCase... to each his own
(loop for elem in xs when (<= x elem) collect elem))
が、それは少し混乱して...あなたはxよりも大きなすべての要素を削除すると言うが、すべての要素を削除しようとしているようなあなたのコードが見えますxはより大きい。私が書いた解決策は、xより大きいすべての要素を返します(つまり、すべての要素を削除するxがより大きい)。
ちょうどあなたがLispで再帰を使うことができるので、それが "Lisp Way"であるとは限りません。 Lispでこれを行うためのメカニズムはいくつかあります(ここで見ています)。それらはすべて慣用的です。再帰的方法は単に最も原始的な方法です。 –