1

フィルターを機能させることはできますが、破壊的には行いません。以下は、開始コードとテスト ケースです。

(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

誰か助けてくれませんか?

4

1 に答える 1

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))))

filter!SRFI 1: List Libraryの手順から上記を適応させました。Racket を使用している場合、上記のコードを適切に機能させるには、1 つまたは 2 つの変更が必要であることに注意してください。たとえば、Racket はサポートされなくなり、代わりset-cdr!に使用する必要がありますset-mcdr!

于 2012-04-24T04:54:54.523 に答える