0

暗号化するメッセージと 2 つのアルファベット (通常と暗号化と呼びます) の 3 つの文字列を取るプロシージャ encrypt を定義します。アルファベット文字列は両方とも同じ長さで、重複はありません。メッセージ内の各文字について、通常の文字で検索し、見つかった場合は、対応する暗号化された場所の文字に変換します。たとえば、通常が abc で暗号化が def の場合、メッセージ内の a は ad としてエンコードされ、ab は e としてエンコードされ、ac は f としてエンコードされます。

私は次のように私のコードを書きました:

(define encrypt
  (lambda (message regular encrypted)
    (define help
      (lambda (ls1 ls2 ls3)
         (if (null? ls1) '()
           (if (and (null? ls2) (null? ls3)) ls1
              (if (equal? (car ls1) (car ls2)) 
                  (cons (car ls3) (help (cdr ls1) ls2 ls3))
                  (help ls1 (cdr ls2) (cdr ls3))))))
    (list->string (help 
                    (string->list message) 
                    (string->list regular) 
                    (string->list encrypted)))))

私はランニングをしようとしてきました。しかし、結果は車の例外を返します: () はペアではありません

かなり何度もチェックしましたが、何を変えるべきかわかりませんでした。誰かが私を助けることができますか?

4

3 に答える 3

3

Óscar López の回答は、このコードで発生している可能性のある問題のいくつかを指摘していますが、言及したエラー メッセージに具体的に対処することが重要だと思います: () is not a pair. これは、ペアを期待する関数を呼び出していることを意味します (したがって、典型的な候補は空のリストにあるcarとなりcdrます。コードを見て、これがどこで発生するかを見てみましょう:

(define help
      (lambda (ls1 ls2 ls3)
         (if (null? ls1) '()                                 ; a
           (if (and (null? ls2) (null? ls3)) ls1             ; b
              (if (equal? (car ls1) (car ls2))               ; c
                  (cons (car ls3) (help (cdr ls1) ls2 ls3))  ; d 
                  (help ls1 (cdr ls2) (cdr ls3))))))         ; e
  1. abペアを期待する関数は呼び出さないため、この問題に遭遇することはありません。
  2. 並んで、cあなたはやります。行はそれが ではないことを保証しましたが、と の両方が;ではないことを確認しただけなので、そうである可能性もあります。どちらかだけでも可能です。(car ls1)(car ls2)als1()ls2b ls2ls3()
  3. dに と が(car ls3)あり(cdr ls1)ます。ではないaことが保証されていますが、前のケースと同じ理由である可能性があります。ls1()ls2
  4. eには(cdr ls2)(cdr ls3)があり、どちらか一方 (両方ではない) が になる可能性があるため、これらの両方が問題を引き起こす可能性があります()

あなたのタイトルはそれを言っていませんでしたが、あなたの質問は、これが で実際に起こっていると述べましcarた。でまたは で発生しています。ecd(car ls2)c(car ls3)d

Dr. Racket を使用してコードを実行している場合、IDE は不正な呼び出しが発生した場所を強調表示する必要があります (この回答のスクリーンショットに示されているようなもの)。

于 2013-10-31T03:06:10.263 に答える
0
(define (encrypt message regular encrypted)
   (letrec ((key 
              (lambda (reg enc)
                 (if (null? reg) 
                     '()
                     (cons (cons (car reg) (car enc)) 
                           (key  (cdr reg) (cdr enc))))))
             (keys (key (string->list regular) 
                        (string->list encrypted))))
    (list->string
      (let loop ((message (string->list message)))
         (if (null? message) 
             '()
              (cons (cdr (assoc (car message) keys)) 
                    (loop (cdr message))))))))
于 2013-10-31T03:18:05.970 に答える