1

私はスキームが初めてで、いくつかの演習を行っています。私は次のことをしようとしています: 私が書こうとしている関数は、1 つのリスト パラメーターを取ります (入力チェックは必要ありません)。次に、要素の複数の出現を削除し、新しいリストを返します。入出力の例を次に示します。関数を「一度」呼び出してみましょう。

=>(once '(1 2 5 2 3 4 2 4 1 2))
=>Value: (1 2 5 3 4)

これが私の解決策です:

(define once
  (lambda (lst)
    (if (null? lst) 
        '() 
        (if (member (car lst) (cdr lst)) 
            (once (cdr lst)) 
            (cons (car lst) (once (cdr lst)))))))

ただし、要素の順序は変更されますが、重複は排除されます。誰でも助けることができますか?ありがとう

4

4 に答える 4

2
(define once L
 (if (null? L)
  '()
   (cons (car L) (once (filter (n-eq-x? (car L)) (cdr L))))))

(define (n-eq-x? value)
 (lambda (x) (if (eq? value x) #f #t)))

あなたのヘルパーでそれを書くことができます

(define (once L)
 (reverse (once-helper L '())))

(define (once-helper L L-once)
 (cond ((null? L) L-once)
       ((member? (car L) (L-once) 
        (once-helper (cdr L) L-once))
       (else (once-helper (cdr L) (cons (car L) L-once)))))

これはオリジナルに近いですが、ここでの違いは、リストの残りの部分には表示されない要素でリストを作成する代わりに、まだメンバーになっていないオリジナルの要素で 2 番目のリストを作成することです。後で要素を取得する場合に false になるのではなく、既に要素を持っている場合、チェックは false になります。

于 2013-05-03T22:42:45.590 に答える
1

Racket では、次のように簡単です。

(define once remove-duplicates)
(once '(1 2 5 2 3 4 2 4 1 2))
=> '(1 2 5 3 4)

ただし、ゼロから実装する必要がある場合は、一般的な考え方として、空白を埋めてください。

(define (once lst)
  (cond (<???>  ; is the list empty?
         <???>) ; return the empty list
        (<???>  ; is the current element member of the rest of the list?
         <???>) ; advance recursion
        (else   ; otherwise it's not duplicate,
         (cons <???>     ; cons current element
               <???>)))) ; advance recursion
于 2013-05-03T22:02:32.990 に答える
1

lst結果にない場合は、からアイテムを追加します。

(define (once lst)
  (let looking ((lst lst) (rst '()))
    (if (null? lst)
        (reverse rst)                   ; leave order unchanged
        (let ((nxt (car lst)))
          (looking (cdr lst)
                   (if (member nxt rst) ; nxt in rst
                       rst              ; yes: don't augment rst
                       (cons nxt rst)))))))
于 2013-05-03T23:49:48.053 に答える