Scheme 删除Racket中列表中第n个元素的功能版本

Scheme 删除Racket中列表中第n个元素的功能版本,scheme,racket,Scheme,Racket,我想得到一个从原始列表中删除了第n个版本的列表。我可以管理以下必需的代码: (define (list-removeN slist n) (define outl '()) (for ((i (length slist))) (when (not (= i n)) (set! outl (cons (list-ref slist i) outl)))) (reverse outl)) 这个功能的等价物是什么?我尝试了/list,但我必须在该位置插入#f或,删除该

我想得到一个从原始列表中删除了第n个版本的列表。我可以管理以下必需的代码:

(define (list-removeN slist n)
  (define outl '())
  (for ((i (length slist)))
    (when (not (= i n))
      (set! outl (cons (list-ref slist i) outl))))
  (reverse outl))

这个功能的等价物是什么?我尝试了/list,但我必须在该位置插入#f或,删除该位置并不理想,因为#f或也可能出现在列表中的其他位置

您可以使用累加器递归地执行此操作。差不多

#lang racket

(define (remove-nth lst n)
  (let loop ([i 0] [lst lst])
    (cond [(= i n) (rest lst)]
          [else (cons (first lst) (loop (add1 i) (rest lst)))])))

(remove-nth (list 0 1 2 3 4 5) 3)
(remove-nth (list 0 1 2 3) 3)
(remove-nth (list 0 1 2) 0)
这就产生了

'(0 1 2 4 5)
'(0 1 2)
'(1 2)
您可以使用
for/list
执行此操作,但由于
length
调用,此版本将遍历列表两次

(define (remove-nth lst n)
  (for/list ([i (length lst)]
             [elem lst]
             #:when (not (= i n)))
    elem))
在处也有拆分,但这可能不是最好的,因为它会创建两个列表并附加它们

(define (remove-nth lst n)
  (let-values ([(left right) (split-at lst n)])
    (append left (rest right))))

您可以使用累加器递归地执行此操作。差不多

#lang racket

(define (remove-nth lst n)
  (let loop ([i 0] [lst lst])
    (cond [(= i n) (rest lst)]
          [else (cons (first lst) (loop (add1 i) (rest lst)))])))

(remove-nth (list 0 1 2 3 4 5) 3)
(remove-nth (list 0 1 2 3) 3)
(remove-nth (list 0 1 2) 0)
这就产生了

'(0 1 2 4 5)
'(0 1 2)
'(1 2)
您可以使用
for/list
执行此操作,但由于
length
调用,此版本将遍历列表两次

(define (remove-nth lst n)
  (for/list ([i (length lst)]
             [elem lst]
             #:when (not (= i n)))
    elem))
在处也有拆分,但这可能不是最好的,因为它会创建两个列表并附加它们

(define (remove-nth lst n)
  (let-values ([(left right) (split-at lst n)])
    (append left (rest right))))

一个典型的roll-your实现是递归的,使用O(n)时间和O(n)空间

(定义(删除第n个lst i)
(左一)
(cond((null?lst);;如果(<(length lst)i)会怎么样

((这是一个典型的滚动您自己的实现,它是递归的,并且使用O(n)时间和O(n)空间

(定义(删除第n个lst i)
(左一)
(cond((null?lst);;如果(<(length lst)i)会怎么样
((