1

リストから7つを選択しようとしています。コードは次のとおりです。

(define (pick7 x)
  (cond ((null? x) x)
        ((= (car x) 7) pick7 (cdr x))
        (else (cons (car x) (pick7 (cdr x))))))

しかし、私が電話(pick7 (1 3 (5 7) 9))をすると、エラーが発生します。私は問題を理解していると思います-(car x)は常に数字になるとは限らないので、それを分解する必要があります。

これを修正するにはどうすればよいですか?

4

2 に答える 2

3

リストから要素を「削除する」ことを「選択する」と言う場合、任意にネストされたリストのリストに対して次のように行い、空白を埋めます。

(define (pick7 x)
  (cond (<???> <???>)               ; if the list is null, return null
        ((not (pair? <???>))        ; if the first element is not a list
         (if <???>                  ;   if the first element is 7
             (pick7 <???>)          ;   advance recursion over rest of list
             (cons <???>            ;   else cons the first element and
                   (pick7 <???>)))) ;   advance recursion over rest of list
        (else (cons                 ; if the first element is a list, then cons
               (pick7 <???>)        ; the recursion over the first element
               (pick7 <???>)))))    ; and the recursion over the rest of list

これは、任意にネストされたリストのリストを処理するための標準テンプレートであることに注意してください。これは、次のような場合に機能します。

(pick7 '(1 3 (5 7 (8 7 (10 7 11))) 9 7))
=> '(1 3 (5 (8 (10 11))) 9)
于 2013-02-28T14:52:39.983 に答える
2

リストから7つを選ぶとはどういう意味ですか? 外すということですか?その場合、最初の要素がリストかどうかも確認する必要があります。

(define (pick7 x)
  (cond ((null? x) x)
        ((<??>) (cons (pick7 (car x)) (pick7 (cdr x))))
        ((= (car x) 7) (pick7 (cdr x)) ; missing paren
        (else (cons (car x) (pick7 (cdr x))))))
于 2013-02-28T14:52:18.597 に答える