2

そのような入力リストで見つかった一意のアトムを返すスキーム関数を作成しようとしています。

> (unique-atoms '(a (b) b ((c)) (a (b))))
(a c b)
> (unique-atoms '(a . a))
(a)
> (unique-atoms '())
()

はじめにこんなことを考えていました

(define (unique-atoms l)
  (if (null? l)
      '()
   (eq? (car (l) unique-atoms(cdr (l))))))

しかし、ユニークなアトムを集めて、すべてを再帰的にチェックしながら新しいリストを作成する方法がわかりません。

4

4 に答える 4

1

この問題には 2 つの部分があります。

  1. サブリストに再帰的に、指定されたフォームの各要素にアクセスする方法を見つける必要があります。
  2. 訪問された固有の要素を収集する方法が必要です。

最初の部分の解決策は次のとおりです。

(define (recursive-fold visitor initial x)
  (let recur ((value initial)
              (x x))
    (cond ((null? x) value)
          ((pair? x) (recur (recur value (car x)) (cdr x)))
          (else (visitor x value)))))

2 番目の部分の実装はあなたに任せます。

于 2013-06-30T02:26:50.667 に答える
1

以下はlist用語ごとに説明します。値がリスト自体である場合next、再帰呼び出しが行われます。(append next rest)つまりlist、サブリストを同時にフラット化します。

(末尾) 再帰関数 を使用してlooking、リストをたどり、 を蓄積しrsltます。nextが にない場合は、結果に追加しrsltます。

(define (uniquely list)
  (let looking ((rslt '()) (list list))
    (if (null? list)
        rslt
        (let ((next (car list))
              (rest (cdr list)))
          (if (list? next)
              (looking rslt (append next rest))
              (looking (if (memq next rslt)
                           rslt
                           (cons next rslt))
                       rest))))))
> (uniquely '(a b (a b) ((((a))))))
(b a)

コードを「不適切なリスト」のように機能させたい場合は'(a . a)、述語null?list?おそらく変更する必要があります。

于 2013-06-30T04:20:58.507 に答える
0

一意でないアイテムが削除される半分の解決策を見つけましたが、これはアトム b と '(b (b)) などの b を含むリストでは機能しません

(define (uniqueAtoms l)
  (cond ((null? l)
         '())
        ((member (car l) (cdr l))
         (uniqueAtoms (cdr l)))
        (else
         (cons (car l) (uniqueAtoms (cdr l))))))
于 2013-06-30T04:23:14.470 に答える
-1

あらゆる種類のリスト構造でこの問題を解決する最も簡単な方法は、リスト構造を 2 つの部分に分割することです

1) フラット化してからリスト - これにより、サブリストのない適切なリストが得られます

; if you use Racket, you can use the build-in flatten procedure
; otherwise this one should do
(define (flatten expr)
  (let loop ((expr expr) (res '()))
    (cond 
      ((empty? expr) res)
      ((pair? expr)  (append (flatten (car expr)) (flatten (cdr expr))))
      (else          (cons expr res)))))

2) この適切なリストの一意のメンバーをすべて見つける

(define (unique-atoms lst)
  (let loop ((lst (flatten lst)) (res '()))
    (if (empty? lst)
        (reverse res)
        (let ((c (car lst)))
          (loop (cdr lst) (if (member c res) res (cons c res)))))))

テスト:

; unit test - Racket specific
(module+ test
  (require rackunit)
  (check-equal? (unique-atoms '(a (b) b ((c)) (a (b)))) '(a b c))
  (check-equal? (unique-atoms '(a (b) b ((c . q)) (a (b . d)))) '(a b c q d))
  (check-equal? (unique-atoms '(a . a)) '(a))
  (check-equal? (unique-atoms '(a b (a b) ((((a)))))) '(a b))
  (check-equal? (unique-atoms '()) '()))
于 2013-07-01T21:07:18.543 に答える