2008-09-05 14 views
4

私はx(値)とxs(リスト)を取得し、xより大きいすべての値をリストから削除する関数を持っています。うーん、それは動作しません、なぜ教えてくれますか?Lispリストの反復

(defun biggerElems(x xs) 
    (let ((xst)) 
    (dolist (elem xs) 
     (if (> x elem) 
      (setf xst (remove elem xs)))) 
    xst)) 

答えて

5

私はそれは正しくありません。このラインだと思う:

(setf xst (remove elem xs)))) 

setfの最初の引数は、値が続き、場所です。あなたはそれを後方に持っているようです(そしてxstnilか未初期化です)。

あなたはそれが簡単にこれを行うに見つけるかもしれない:

(defun biggerElems (x xs) 
    (remove-if (lambda (item) (> item x)) xs)) 
1

それはそのように働いた:

(defun filterBig (x xs) 
    (remove-if (lambda (item) (> item x)) xs)) 

のための '#' 何でしたか?それはそれでコンパイルされませんでした。

0

「#」は何ですか?それは でコンパイルされませんでした。

Typo。通常は#'(remove-if #'oddp list)など)の関数を参照していますが、編集中は '#'を削除するのを忘れていました。あなたはこのLispの道を行いたい場合は

1

、新しいリストを返すために再帰を使用することができます。

(defun biggerElems (x xs) 
    (cond ((null xs) NIL) 
     ((< x (car xs)) 
     (biggerElems x (cdr xs))) 
     (t 
     (cons (car xs) (biggerElems x (cdr xs)))))) 

@をルイス・オリヴェイラこのソリューションは、問題の投稿を1と対比することである

。もう少し複雑なことをする必要があったなら、リストを操作する再帰的なアプローチに根ざすことが重要です。

+0

ちょうどあなたがLispで再帰を使うことができるので、それが "Lisp Way"であるとは限りません。 Lispでこれを行うためのメカニズムはいくつかあります(ここで見ています)。それらはすべて慣用的です。再帰的方法は単に最も原始的な方法です。 –

4

ほとんどの簡潔な私の知る限り:新鮮なリストを返す

(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)) 
1

を@ 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がより大きい)。