Recursion 加密[小Chez方案]

Recursion 加密[小Chez方案],recursion,scheme,chez-scheme,Recursion,Scheme,Chez Scheme,我有一个问题,是关于我一直试图运行的一个程序。 Encrypt接受消息、公钥和私钥,并返回消息,其中公钥中的消息字母更改为私钥中的字母 例如,(加密“abcd”“abcd”“efgh”)应返回“efgh” 和(加密“abcl”“abcd”“efgh”)应返回“efgl”(不在公钥中的邮件信件将保持不变) 我已经编写了一些帮助程序来解决这个问题,但是当我尝试运行它时,我不断得到错误“车内异常,不是一对”。。但我不知道有什么不对劲。如果有人有什么建议,请告诉我。谢谢 (define encrypt

我有一个问题,是关于我一直试图运行的一个程序。 Encrypt接受消息、公钥和私钥,并返回消息,其中公钥中的消息字母更改为私钥中的字母

例如,(加密“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

问题是,在
加密帮助程序
中,您正在调用

[else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls)...
但是
(汽车公共ls)
(和
(汽车私人ls)
)是一个原子,而在
加密密钥
中,您也可以执行

[(equal? char (car pub-key) ...
您不能在这里使用
car-pub-key
,因为
car
只能在列表上工作,而
pub-key
是一个原子

在你给出的例子中,它是有效的,即

(encrypt-key 'a '(a) '(b)) => b
您会注意到,正是出于这个原因,
(a)
(b)
被指定为列表。提示:

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

我将把它放在那里:)

scheme很容易调试。踏步机在哪一步让你停下?谢谢,这真的帮了我很大的忙:)。有人向我指出的另一个问题是,在助手的递归调用中,我正在对公共和私有列表进行CDR记录!虽然这返回了加密列表,但它没有返回列表中不在公共列表中的其余部分。@米歇尔:在DrScheme(现在已成为Racket)编辑器中,您的原始错误在代码中产生了程序流,以指示错误发生的位置,以及之前对该点的调用。它使调试变得非常容易。您使用什么环境来处理Scheme?