2011-12-05 11 views
5

から重複した数字を削除し、私はスキーム:リスト

(define (create-list . e) 
    e) 

指定された引数の数エンからリストを作成するには、このコードを書いたしかし、私はそれは、このブロック自体の中に、リストから任意の重複番号を削除する必要があります。

私は数時間試して検索しましたが、他のブロックに何十行ものコードを入れずに解決策を見つけることはできません。例えば

のは、私の入力は、私は(2 2 3 5 5) 'ではない(2 3 5)と' であることを作成したリストが必要

(create-list . 2 2 3 5 5) 

あるとしましょう...

順数字の大小は関係ありません。

+0

はhttp://stackoverflow.com/a/8651932/450148 –

答えて

4

基本的に、あなたのような何かをする必要があります:あなたは、既存の機能を使用できない場合

(define (dedupe e) 
    (if (null? e) '() 
     (cons (car e) (dedupe (filter (lambda (x) (not (equal? x (car e)))) 
            (cdr e)))))) 

:私はこれを行うには本当に単純だが、おそらく非効率的な方法を考えることができ

(define (create-list . e) (dedupe e)) 

(define (my-filter pred ls) 
    (cond ((null? ls) '()) 
     ((pred (car ls)) (cons (car ls) (my-filter pred (cdr ls)))) 
     (else (my-filter pred (cdr ls))))) 
+0

唯一のCDR /車/短所と原始的な方法で同じコードを作成することは可能であろうも参照してください? (フィルター/ヘッド/テイルなし) – spacing

+0

はい。実際、 'head'と' tail'はすでにそれぞれ 'car'と' cdr'です(私の心にはあまりにも多くのHaskellです)。 –

+0

また、私の構文はちょっと離れているかもしれないことに注意してください。私はずっと最近Haskellを使っていましたが、私はたった今stkを使っていました。 –

0

最も効率的な(ラーベ:filterのように、あなたは1自分で作ることができますリストを一度rsingする)方法は、リストを要素ごとに通過する関数を定義することです。この関数は、どの要素が既に重複していないリストに入っているかのリストを格納します。

@Tikhon Jelvisに比べてこのソリューションの利点は、リストの要素を重複排除するために順番に並べる必要がないことです。

(define (elem? a l) 
     (cond ((null? l) #f) 
      ((equal? a (car l)) #t) 
      (else (elem? a (cdr l))))) 

私たちは前に見ていない各要素を格納し、リストをトラバースすることができます:

(define (de_dupe l_remaining already_contains) 
    (cond ((null? l_remaining) already_contains) 
     ((elem? (car l_remaining) already_contains) (de_dupe (cdr l_remaining) already_contains)) 
     (else (de_dupe (cdr l_remaining) (cons (car l_remaining) already_contains))))) 

alの要素である場合と言う機能elem、考える

:効率のために、これは逆の順序で要素を返します

+1

私のバージョンには何らかの順序で要素が必要ですか?私が知る限り、それはしません。 –

+0

@Tikhon Jelvis:それはそれのように見えました。しかし、私は正しい値を返すことができません。例: "(create-list 3 5 4 3 4 6)"は "(3 3)"を返します。 – amindfv

+0

これは注文のためではありませんでした。私は今それを修正した。 –

2

これは速いです:

(define (remove-duplicates l) 
    (cond ((null? l) 
     '()) 
     ((member (car l) (cdr l)) 
     (remove-duplicates (cdr l))) 
     (else 
     (cons (car l) (remove-duplicates (cdr l)))))) 

さらに、 mit-schemeは削除複製を提供します。これはあなたが望むものを正確に行います。

0
(define (delete x) 
(cond 
((null? x) x) 
((= (length x) 1) x) | ((null? (cdr x)) x) 
((= (car x) (cadr x)) (delete (cdr x))) 
(#t (cons (car x) (delete (cdr x)))) 
) 
)