我对我一直想要运行的程序有疑问。 加密接收消息,公钥和私钥,并返回消息,其中公钥中的消息中的字母更改为私钥中的字母。
对于ex,(加密“abcd”“abcd”“efgh”)应返回“efgh” 和(加密“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
答案 0 :(得分: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
,因为car
仅适用于列表,而pub-key
是原子。
在你举例说明的例子中,即
(encrypt-key 'a '(a) '(b)) => b
您会注意到'(a)
和'(b)
被指定为列表,正是出于这个原因。提示:
>(cons 'a ())
(a)
>
我会留在那里:)