我可以让过滤器工作,但它并不是破坏性的。以下是起始代码和测试用例:
(define (filter! f s)
;;Your solution
测试用例:
(define (big x) (> x 5))
(define ints (list 1 10 3 8 4 7))
(define ints1 (cdr ints))
(define filtered-ints (filter! big ints))
filtered-ints
; expect (10 8 7)
(eq? filtered-ints ints1) ; expect #t
有人可以帮忙吗?
答案 0 :(得分:1)
这应该有效:
(define (filter! f lst)
(let loop ((ans lst))
(cond ((null? ans)
ans)
((not (f (car ans)))
(loop (cdr ans)))
(else
(scan-in f ans (cdr ans))
ans))))
(define (scan-in f prev lst)
(if (pair? lst)
(if (f (car lst))
(scan-in f lst (cdr lst))
(scan-out f prev (cdr lst)))))
(define (scan-out f prev lst)
(let loop ((lst lst))
(if (pair? lst)
(if (f (car lst))
(begin (set-cdr! prev lst)
(scan-in f lst (cdr lst)))
(loop (cdr lst)))
(set-cdr! prev lst))))
我在SRFI 1:列表库中的filter!
过程中对上述内容进行了调整。请注意,如果您正在使用Racket,则需要修改一两件事以使上述代码正常工作。例如,Racket不再支持set-cdr!
,您必须使用set-mcdr!
代替。