3

私はSchemeでこのプログラムを実装するのに少し問題がありますが、私はそこまでの道のりの90%だと思います。残念ながら、これは宿題なので、少し漠然としている必要があります。(ABCD)に戻りたい(BD)。しかし、safe-carに引数として渡されたオブジェクト()はペアではないというエラーが発生します| 「これは私のコードです:

(DEFINE (other_el lis)
  (COND
   (( NULL? lis ) '())
   ((LIST? lis)
    (append (CADR lis) (other_el (CDR lis))))
   (ELSE (show " USAGE: (other_el [LIST])"))))
4

2 に答える 2

2

これはあなたが尋ねた前の質問よりもかなり単純です。各ステップで長さを計算する必要はなく(非常に非効率的である可能性があります)、それを解決するために追加操作を使用する必要はありません(cons代わりに使用してください)。答えの構造は次のとおりです。宿題のように見えるので、空欄に記入させていただきます。

(define (every-other lst)
  (if (or <???>                    ; if the list is empty 
          <???>)                   ; or the list has a single element
      <???>                        ; then return the empty list
      (cons <???>                  ; otherwise `cons` the second element
            (every-other <???>)))) ; and recursively advance two elements

最初にエラーチェックを行う必要がある場合は、別の関数を使用して、引数が正しいことを確認した後で上記のプロシージャを呼び出します。

(define (other_el lst)
  (if (list? lst)
      (every-other lst)
      (error "USAGE: (other_el [LIST])")))

次のように使用します。

(other_el '(A B C D E G))
=> '(B D G)
于 2012-11-10T04:01:05.453 に答える
1

このコードには、適切なコードを示す前に言及する必要のある小さな問題がいくつかあります。

  1. cdrなどのプロシージャの名前を大文字にしないでください。Schemeで定義してください。
  2. エラーメッセージを手動で表示しないでください。例外を使用します。
  3. コードは常にインデントする必要があります。(編集:誰かが質問のコードを編集してインデントを含めたようです)

とにかく、これがあなたが探している関数です:

(define (evens lst)
  (if (or (null? lst)             ; if the list is empty 
          (null? (cdr lst)))      ; or the list has a single element
      '()                         ; then return the empty list
      (cons (cadr lst)            ; otherwise `cons` the second element
            (evens (cddr lst))))) ; and recursively advance two elements

DrRacket 5.3で関数をテストしたところ、指定したとおり、(偶数'(ABCD))は'(BD)を返します。ご不明な点がございましたら、お気軽にお問い合わせください。宿題を頑張ってください!

于 2012-11-10T02:28:40.807 に答える