1

実行しようとしているプログラムについて質問がありました。Encryptは、メッセージ、公開鍵、および秘密鍵を受け取り、公開鍵のメッセージの文字が秘密鍵の文字に変更されたメッセージを返します。

たとえば、(encrypt "abcd" "abcd" "efgh")は "efgh"を返し、(encrypt "abcl" "abcd" "efgh")は "efgl"(公開されていないメッセージからの手紙-キーは同じままです)。

これを解決するためにいくつかのヘルパープログラムを作成しましたが、実行しようとすると「車の例外、__はペアではありません」というエラーが表示され続けます。しかし、何が問題なのかわかりません。誰かがポインタを持っているなら、私に知らせてください。ありがとう!

(define encrypt
  (lambda (message public-key private-key)
    (cond
      [(list->string (encrypt-helper (string->list message)
      (string->list public-key) (string->list private-key)))])))

(define encrypt-helper
  (lambda (msg-ls public-ls private-ls)
    (cond
      [(null? public-ls) '()]
      [(null? private-ls) '()]
      [(and (null? public-ls) (null? private-ls)) msg-ls]
      [else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls))
        (encrypt-helper (cdr msg-ls) (cdr public-ls) (cdr private-ls)))])))

;should encrypt all letters in msg-ls. not working correctly

(define encrypt-key
  (lambda (char pub-key priv-key)
    (cond
      [(null? pub-key) char]
      [(equal? char (car pub-key)) (car priv-key)]
      [else (encrypt-key char (cdr pub-key) (cdr priv-key))])))

;encrypts just one letter, ex: (encrypt-key 'a '(a) '(b)) => b
;works correctly
4

1 に答える 1

2

問題は、内部encrypt-helperで、あなたが呼んでいるということです

[else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls)...

しかし(car public-ls)(そして(car private-ls))はアトムですが、encrypt-keyあなたの中には

[(equal? char (car pub-key) ...

はアトムであるのに対し、リストでのみ機能するcar pub-keyため、ここにアクセスすることはできません。carpub-key

あなたがその作品を与える例では、すなわち

(encrypt-key 'a '(a) '(b)) => b

まさにこの理由から、とがリストとして指定されている'(a)ことに気付くでしょう。'(b)ヒント:

>(cons 'a ())
(a)
> 

そのままにしておきます:)

于 2011-03-30T20:03:25.017 に答える