Encryption 加密方案:[()不是一对]

Encryption 加密方案:[()不是一对],encryption,scheme,racket,Encryption,Scheme,Racket,定义一个加密过程,它包含三个字符串:一个要加密的消息和两个字母,我们称之为常规和加密。字母表字符串的长度相同,不包含重复项。对于消息中的每个字符,请在常规中查找,如果找到,请将其转换为相应加密位置的字符。例如,如果规则是abc,加密的是def,这意味着消息中的a将编码为d,b编码为e,c编码为f 我编写的代码如下: (define encrypt (lambda (message regular encrypted) (define help (lambda (ls1 l

定义一个加密过程,它包含三个字符串:一个要加密的消息和两个字母,我们称之为常规和加密。字母表字符串的长度相同,不包含重复项。对于消息中的每个字符,请在常规中查找,如果找到,请将其转换为相应加密位置的字符。例如,如果规则是abc,加密的是def,这意味着消息中的a将编码为d,b编码为e,c编码为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)))))
我一直在试着跑步。但是结果在car中返回异常:()不是一对


我已经检查过很多次了,但我不知道该换什么。有人能帮我吗?

帮助功能并不是你想象的那样,你实际上需要两个助手:

  • 一个用于迭代消息并“加密”消息中的每个字符,因此它使用下一个函数作为帮助器
  • 一个用于“加密”单个字符,负责查找与明文字符对应的加密字符

如果不执行上述操作,您会发现并不是所有字符都被替换,因为您只需遍历一次常规/加密列表,但要使算法正常工作,您必须为输入消息中的每个字符遍历一次。

help函数并没有按照您的想象进行操作,实际上,您需要两个助手:

  • 一个用于迭代消息并“加密”消息中的每个字符,因此它使用下一个函数作为帮助器
  • 一个用于“加密”单个字符,负责查找与明文字符对应的加密字符
如果不执行上述操作,您会发现并不是所有字符都被替换,因为您只需遍历一次常规/加密列表,但要使算法正常工作,您必须为输入消息中的每个字符遍历一次这些列表。

指出了此代码中可能存在的一些问题,但我认为,明确指出您提到的错误消息非常重要:
()不是一对。这意味着您正在调用一个期望一对的函数(因此,典型的候选者将是“代码> CUB/CODE”和“代码> 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
  • a
    b
    不调用任何期望成对的函数,因此您不应该在那里遇到这个问题
  • 在第
    c
    行中,您可以
    (汽车ls1)
    (汽车ls2)
    。第
    a
    行确保
    ls1
    不是
    ()
    ,但
    ls2
    仍然可以,因为
    b
    仅检查
    ls2
    ls3
    不是
    ()
    ;任何一个都可能是单独的
  • 在第
    d
    行中,您得到了
    (汽车ls3)
    (cdr ls1)
    。第
    a
    行确保了
    ls1
    不是
    ()
    ,但
    ls2
    仍然可能与前一个案例中给出的原因相同
  • e
    具有
    (cdr ls2)
    (cdr ls3)
    ,这两个都可能导致问题,因为其中一个(但不是两个)可能是
    ()
  • 虽然你的标题没有说,但你的问题提到这实际上是发生在
    汽车上的,这意味着它不是发生在
    e
    中,它留下
    c
    d
    。它不是发生在
    汽车ls2
    中的
    中的
    中,就是发生在
    c
    中的
    (汽车ls3)
    中的

    如果您使用Dr.Racket运行代码,IDE应该突出显示错误调用发生的位置(如中的屏幕截图所示)。

    指出了此代码中可能存在的一些问题,但我认为特别指出您提到的错误消息非常重要:
    ()这不是一个对< /代码>。这意味着您正在调用一个期望一对的函数(因此,典型的候选者将是“代码> CAL<代码/代码>”和“代码> 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
    
  • a
    b
    不调用任何期望成对的函数,因此您不应该在那里遇到这个问题
  • 在第
    c
    行中,您可以
    (汽车ls1)
    (汽车ls2)
    。第
    a
    行确保
    ls1
    不是
    ()
    ,但
    ls2
    仍然可以,因为
    b
    仅检查
    ls2
    ls3
    不是
    ()
    ;任何一个都可能是单独的
  • 在第
    d
    行中,您得到了
    (汽车ls3)
    (cdr ls1)
    。第
    a
    行确保了
    ls1
    不是
    ()
    ,但
    ls2
    仍然可能与前一个案例中给出的原因相同
  • e
    具有
    (cdr ls2)
    (cdr ls3)
    ,这两个都可能导致问题,因为其中一个(但不是两个)可能是
    ()
  • 虽然你的标题没有说,但你的问题提到这实际上是发生在
    汽车上的,这意味着它不是发生在
    e
    中,它留下
    c
    d
    。它不是发生在
    汽车ls2
    中的
    中的
    中,就是发生在
    c
    中的
    (汽车ls3)
    中的


    如果您使用Dr.Racket运行代码,IDE应该突出显示错误调用发生的位置(如中的屏幕截图所示)。

    我没有看到问题标题中所述的错误,但请注意代码中的括号是错误的,您没有正确关闭