Scheme 删除Racket中列表中第n个元素的功能版本
我想得到一个从原始列表中删除了第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或,删除该
(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)会怎么样
((