これは私が欲しいものです:
(delete-third1 '(3 7 5)) ==> (3 7)
(delete-third1 '(a b c d)) ==> (a b d)
だから私は次のようなことをしました:
(define (delete-third1 LS ) (list(cdr LS)))
返す
(delete-third1 '(3 7 5))
((7 5))
あるべきとき(3 7)
。私は何を間違っていますか?
これは機能します:
(define (delete-third! l)
(unless (or (null? l)
(null? (cdr l))
(null? (cddr l)))
(set-cdr! (cdr l) (cdddr l)))
l)
リストを変更しないバージョンが必要な場合:
(define (delete-third l)
(if (not (or (null? l)
(null? (cdr l))
(null? (cddr l))))
(cons (car l) (cons (cadr l) (cdddr l)))
l))
そして、n番目の要素に対してそれを行いたい場合:
(define (list-take list k)
(assert (not (negative? k)))
(let taking ((l list) (n k) (r '()))
(if (or (zero? n) (null? l))
(reverse r)
(taking (cdr l) (- n 1) (cons (car l) r)))))
(define (delete-nth l n)
(assert (positive? n))
(append (list-take l (- n 1))
(if (> n (length l))
'()
(list-tail l n))))
(define (nth-deleter n)
(lambda (l) (delete-nth l n)))
(define delete-3rd (nth-deleter 3))
最も簡単な方法は次のとおりです。最初の要素、2 番目の要素、および 4 番目の位置から始まるリストの残りの部分を cons します。これは宿題のように見えるので、大まかなアイデアだけを紹介します。空欄を埋めてください。
(define (delete-third1 lst)
(cons <???> ; first element of the list
(cons <???> ; second element of the list
<???>))) ; rest of the list starting from the fourth element
上記は、リストに少なくとも3 つの要素があることを前提としています。そうでない場合は、最初にリストのサイズを検証し、その場合に適切な値を返します。
さらにいくつかのヒント: Racket には、リストの最初の要素にアクセスするための直接的な手順があります。もう 1 つは 2 番目の要素にアクセスするためのものです。最後に、一連のcdr
s を使用して ... リストの残りの部分に到達することができます (ただし、それでもよりコンパクトに記述できます)。
実用的な観点から、これが宿題でなければ、他の既存の手順の観点からこの機能を簡単に実装でき、任意の位置で要素を削除するのに十分なほど一般的にすることさえできます。たとえば、3 番目の要素を削除する場合 (ここでも、リストに十分な要素があると仮定します):
(append (take lst 2) (drop lst 3))
または、特定の 0 ベースのインデックスから要素を削除する一般的な手順として:
(define (remove-ref lst idx)
(append (take lst idx) (drop lst (add1 idx))))
3 番目の要素を削除する方法は次のとおりです。
(remove-ref '(3 7 5) 2)
=> '(3 7)