0

アイテムのリストから特定のアイテムの最初のトップ レベルの出現を削除するスキーム関数を記述します。例: 与えられたリスト (abc) 項目 b、結果リスト (ac)

助けてください

4

6 に答える 6

3

何を達成しようとしているのかを考えてください。

もののリストがあり、特定の要素を削除しようとしています。

 example: trying to remove b
 (a a a a b a a b a ...)
 anything before first b should be kept and anything after it also..
 so we have to spit out from our function:
 a a a a + a a b a ...

これを再帰で操作するように減らすとしたら、次のようになります。

 at any point looking through the list you can:

 1. inspect element at front of the list and give it out to the result
    and recursively inspect the rest of the list
 2. stop if you found your element and 
    give out the rest of the list as you've accomplished your task
于 2010-05-02T12:02:29.670 に答える
1

あなたが何を望んでいるのかわかりませんが、最初は単純にインデックスから始めてください。これは、Scheme で「考える」必要がある方法とほぼ同じです。リストの残りの部分である必要があります。そして、「まあ、それが最初ではない場合はどうでしょうか」という答えは、「残りに適用された同じ手順の結果まで最初のものをconsする必要があります。」、それがSchemeがこれに必要とするすべての情報であり、多くの場合本当。

    (define (slice-out lst k)
      (if (<= k 0) (cdr lst) ; if we want to remove the first (0) element, surely the result is simply the tail of the list?
          (cons (car lst) ; if it's higher than 0, we just cons the first element...
                (slice-out (cdr lst) (- k 1))))) ; to the result of the same method applied to the tail but with one lower k.

> (slice-out '(a b c d e) 2)
===>(a b d e)

リストがインデックスに対して短すぎる場合、この関数はエラーを返します。

ただし、別のオブジェクトと同等にスライスしたい場合は、この例で十分です。0 に到達するからスライスすることはなくなりましたが、検索の例と同じ場合は次のようになります。

(define (slice-out-by-equality lst search)
  (if (equal? (car lst) search) (cdr lst)
      (cons (car lst)
            (slice-out-by-equality (cdr lst) search))))

> (slice-out-by-equality '(a b c d e) 'c)
===> (a b d e)

まったく同じ原則を使用して、アイテムが見つからない場合、これはエラーを返します。

ポイントは、スキームには等価比較の多くのフレーバーがあるということです。したがって、実際に必要なのは次のとおりです。

(define (make-slice-out comparison)
  (lambda (lst search)
    (let loop ((lst lst))
      (cond 
        ((null? lst) '())
        ((comparison (car lst) search) (cdr lst))
        (else (cons (car lst) (loop (cdr lst))))))))

この例では、Scheme とは何かを示しています。ご存知かどうかはわかりませんが、ここではクロージャを使用しています。この関数は、実際には任意のバイナリ比較関数を引数として取り、必要な関数に評価されます。これもサニタイズされています。 、それが見つからなくてもエラーは発生しません。単に古いリストを返します。リストの最後に到達しても、まだ何も削除されていない場合は、それを () まで再びコンセスするためです。

> ((make-slice-out =) '(1 2 3 6 3) 6)
===> (1 2 3 3); we just made an anonymous function here.

しかし、元の関数を思い出すと、述語「equal?」を指定するときに、次のように単純に定義できるようになりました。新しい関数は実際には古い関数を評価します (サニタイズされた重要なアセットを使用):

(define slice-out-by-equality (make-slice-out equal?))

そして、さらにバイナリ比較があります。このよりエキゾチックな例はどうですか:

(define slice-out-less-than (make-slice-out <))

このように、検索語より厳密に小さい最初の要素を切り出す関数を作成したため、これが機能します。

> (slice-out-less-than '(573 284 238 174 92 47) 100)
====> (573 284 238 174 47)

47 も 100 未満ですが、92 はその最初のものです。

于 2010-05-03T16:18:47.483 に答える
0

(define(remove-first-occurence list element accum)(cond
((null?list)accum)(else(cond((=(car list)element)(cons accum(cdr list)))(else(remove-first -occurence(cdr list)element(cons(car list)accum))))))))

(最初の発生を削除'(1 2 3)2'())

于 2010-05-03T13:57:07.783 に答える
0

このようなもの(宿題の場合):

(define (remove-first-occurence some-list find-symbol accum)
  (cond 
    [(empty? some-list) accum]
    [else (cond
           [(= (first some-list) find-symbol) (cons accum (rest some-list))]
           [else (remove-first-occurence (rest some-list) find-symbol (cons (first some-list) accum))]
           )]))

(remove-first-occurence '(1 2 3 4 3) 3 empty)
于 2010-05-02T12:11:10.990 に答える
0

リストの一部を取得できる関数 car と cdr があります。関数 append を使用すると、2 つのリストを 1 つに結合できます。私は彼らが便利になるかもしれないと思います。また、cons 関数をチェックして、リストが実際に何であるか、およびリストとペアとの関係を理解し​​ていることを確認してください。

たとえば、次のように進めることができます。あなたのリストを取り、最初の要素を切り取って、それが何であるかを確認してください。削除するものである場合は、破棄します。削除する要素でない場合は、リストの残りを処理してから、その要素を先頭に追加します。

于 2010-05-02T11:55:21.047 に答える
-1
perl2scheme -s \
'厳密を使用します。サブ remove_first { \
grep { $_ ne $_[0] || $first++ } @{ $_[1] }; } \
print join(",",remove_first("b", ("a","b","c"));'

perl2scheme を実装するという些細な残りのタスクは、読者の演習として残されています。

于 2010-05-02T11:55:26.093 に答える