3

このフォームにリストがあります

( (1 3) (2 2) (3 1) (4 5) (5 1)))

そして、アイテムを削除したいとしましょう(3 1)

したがって、結果は次のようになります

( (1 3) (2 2) (4 5) (5 1)))

私はこのようなことを書きましたが、なぜ正しく実行されないのかわかりません。

(define (deleteItem list item)
  (cond
    ((equal? item (car  list)) (cdr list))
    (cons (car  list)(deleteItem(cdr list) item))))
4

3 に答える 3

4

これには組み込み関数があり、次のように呼ばれremoveます。

(define lst
  '((1 3) (2 2) (3 1) (4 5) (5 1)))

(remove '(3 1) lst)
=> '((1 3) (2 2) (4 5) (5 1))

…でも、ゼロから実装する必要があると思います。あなたのコードのためのいくつかの提案:

  • list組み込み関数と競合するため、パラメーター名として使用しないでください。lst代わりに呼びましょう
  • ほとんどのリスト手順で必要な基本ケースが欠落しています:リストが空の場合はどうなりますか?
  • else最後の状態の部分も欠落しています

上記のすべての修正を行うと、手順は機能します。

(define (deleteItem lst item)
  (cond ((null? lst)
         '())
        ((equal? item (car lst))
         (cdr lst))
        (else
         (cons (car lst) 
               (deleteItem (cdr lst) item)))))

(deleteItem lst '(3 1))
=> '((1 3) (2 2) (4 5) (5 1))
于 2013-11-11T18:55:18.860 に答える
0

1)入力リストが単純なリストである可能性があると考える場合、またはネストされたリストの最上位にあるアイテムを削除したいだけの場合:

delete 2 from (1 2 3 4) will return (1 2 3)
delete 2 from (1 2 3 (2 3) 3 2 4) will return (1 3 (2 3) 3 4)

上記の 2 番目の例を見るとわかるように、ネストされたリストの最上位の項目を削除するだけで、内部リスト内では変更しません。

このコードは次のようになります。

(define (deleteitem list1 item) 
( cond
    ((null? list1) ’())
    ((equal? (car list1) item) (deleteItem (cdr list1) item)) 
    (else (cons (car list1) (deleteitem (cdr list1) item)))
))

2) 入力リストがネストされたリストである可能性があると考える場合

例えば:

input list: (1 2 3 (3 2 (2 4 (2 5 6) 2 5 6) 2 4) 2 3 (2 3 4))

入力リストの要素2を削除します

the output list should be: (1 3 (3 (3 (5 6) 5 6) 4) 3 (3 4))

コードは次のようになります。

(define (delete2 list1 item) 
    ( cond
    ((null? list1) '())
    ((pair? (car list1)) (con (delete2 (car list1) item) (delete2 (cdr list1) item)))
    ((equal? (car list1) item) (delete2 (cdr list1) item)) 
    (else (cons (car list1) (delete2 (cdr list1) item)))
))
于 2014-11-04T21:06:17.783 に答える