0

次のコードを使用して、リストの奇数要素を取得できます。

(define (odds lis)
(cond
    ((null? lis) '())
    ((not (list? lis)) (quote (Usage: odds(list))))
    ((null? (car lis)) '())
    ((= (length lis) 1) (car lis))
    (else (cons (car lis) (odds (cddr lis))))))

ただし、長さが奇数のリストを入力すると、例: (odds '(abcde)) (ac . e) が返されます。

どうすればこの不快な期間を取り除くことができますか?

4

2 に答える 2

0

これを試してみてください。これは 1 行だけの変更です。

(define (odds lis)
  (cond
    ((null? lis) '())
    ((not (list? lis)) (quote (Usage: odds(list))))
    ((null? (car lis)) '())
    ((= (length lis) 1) lis) ; change here
    (else (cons (car lis) (odds (cddr lis))))))

強調表示された行では、適切なリスト (null で終わるリスト) ではなく単一の要素を返していました。これが問題の原因でした。

于 2012-11-14T22:55:52.043 に答える
-1

コードにはいくつかの問題があります。

  • ((null? (car lis)) '()) は必要ありません

リストに要素が 1 つある場合は car が null にならず、最後の条件が対応し、リストに要素がない場合は最初の条件が対応するため、これは必要ありません。

  • ((= (長さ lis) 1) (車 lis))

この終了状態には 3 つのバグがあります。

  1. 最後の条件は 1 要素のリストの場合に対応するため、必要ありません。

  2. ペアではなく原子要素を返します。ペアに変換されると、結果は (x . atom) になります。

  3. 回答の最後にエラー メッセージを追加する代わりに、(error "something") をスローできます。

したがって、これら 2 つの条件を削除すると、コードは希望どおりになります。

(define (odds lis)
(cond
    ((null? lis) '())
    ((not (list? lis)) (quote (Usage: odds(list))))
    (else (cons (car lis) (odds (cddr lis))))))
于 2012-11-14T23:48:40.860 に答える