List 球拍方案删除范围内列表元素

List 球拍方案删除范围内列表元素,list,range,racket,List,Range,Racket,如何删除范围(a、b)中列表的值?我试过: #lang racket (define (remove L i n) (cond ((null? L) empty) ((> i 0) (cons (car L) (remove (cdr L) (sub1 i) n))) ((> n 0) (remove (cdr L) i (sub1 n))) (else L)

如何删除范围(a、b)中列表的值?我试过:

#lang racket

(define (remove L i n)
  (cond ((null? L)
         empty)
        ((> i 0)
         (cons (car L) (remove (cdr L) (sub1 i) n)))
        ((> n 0)
         (remove (cdr L) i (sub1 n)))
        (else
         L)))
但结果是:

(remove '(1 2 3 4 5) 2 4)
'(1 2)
(remove '(1 2 3 4 5 6 7 8 9) 2 5)
'(1 2 8 9)
我希望:

(remove '(1 2 3 4 5) 2 4)
'(1 5)

我认为,如果在当前索引中保留另一个参数,这将更容易实现:

(define (remove L index start end)
  (cond ((null? L)
         empty)
        ((and (>= index start) (<= index end))
         (remove (cdr L) (add1 index) start end))
        (else
         (cons (car L) (remove (cdr L) (add1 index) start end)))))
无论哪种方式,它都能按预期工作:

(remove '(1 2 3 4 5) 2 4)
=> '(1 5)
(remove '(1 2 3 4 5 6 7 8 9) 2 5)
=> '(1 6 7 8 9)
有两个错误:

  • 您使用的是基于一的索引,因此第一个条件应该是
    (>i1)
  • 由于列表在第一个递归子句中收缩,因此也需要
    (sub1 n)

    传递
    n
    会计算要删除的元素数量,而不是停止位置的索引
(remove '(1 2 3 4 5) 2 4)
=> '(1 5)
(remove '(1 2 3 4 5 6 7 8 9) 2 5)
=> '(1 6 7 8 9)