1

私は、Scheme の assoc に似た手順を書こうとしています。2 つの唯一の違いは、プロシージャが指定されたキーに関連する値のみを返すようにすることです。 assoc はペア全体 (key . value) を返します。これが私の手順です:

(define alist '((a . 1) (b . 2) (c . 3)))

(define (search-list key list)
  (cond ((null? key) #f)
        ((eq? (caar list) key) (cdar list))
        ((null? (cdr list)) #f)
        (else search-list key (cdr list))))

私は正しい軌道に乗っているようです -- (search-list 'a alist) は 1 を返します。しかし、(search-list 'b alist) でテストすると、これが私の出力です: ((b . 2) (c . 3) )))

自分の手順が意図したとおりに機能しない理由がわかりません。私の手順の誤りを指摘していただけると大変嬉しく思います。前もって感謝します。

4

3 に答える 3

0

assq(notassocを使用している)の動作を正確に望んでいないことに注意してください。ただし、実装では引き続き使用できます。eq?equal?assq

(define (search-list key lst)
  (cond ((assq key lst) => cdr)
        (else #f)))

> (search-list 'b '((a . 1) (b . 2) (c . 3)))
2

また、既存のコードは失敗する'()ため、リストに問題があります。caar通常、再帰アルゴリズムでは(null? lst)、あなたの場合の基本ケースが最初にテストされます。

于 2014-05-21T17:33:28.767 に答える
0

問題は、最後の行の search-list への呼び出し (または呼び出しの欠落) でした。これは括弧で囲まれていないため、プロシージャが再帰的に呼び出されることはなく、プロシージャは (search-list key (cdr list)) ではなく (cdr list) を返しました。このコードは意図したとおりに機能します。

(define alist '((a . 1) (b . 2) (c . 3)))

(define (search-list key list)
  (cond ((null? key) #f)
        ((eq? (caar list) key) (cdar list))
        ((null? (cdr list)) #f)
        (else (search-list key (cdr list)))))
于 2014-05-21T09:46:58.803 に答える