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

时间:2013-10-31 01:50:05

标签: encryption scheme racket

定义一个带有三个字符串的过程加密:一个要加密的消息和两个字母,我们称之为常规和加密。字母表字符串长度相同,不包含重复项。对于邮件中的每个字符,请定期查找,如果找到,则将其转换为加密对应位置中的字符。例如,如果常规是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中的异常:()不是一对

我很多次检查,但我没有改变。有没有人可以帮助我?

3 个答案:

答案 0 :(得分:3)

Óscar López's answer指出了您在此代码中可能遇到的一些问题,但我认为专门解决您提到的错误消息非常重要:() is not a pair。这意味着你正在调用一个需要一对的函数(所以典型的候选者在空列表中是carcdr。让我们看看你的代码,看看这可能发生在哪里:< / p>

(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)。行a确保ls1不是(),但ls2仍然可以,因为b仅检查两者都不是 ls2ls3();任何一个人仍然可以。
  3. d行中,您有(car ls3)(cdr ls1)。第a行确保ls1不是(),但ls2仍然可能出于上一个案例中给出的相同原因。
  4. e(cdr ls2)(cdr ls3),这两者都可能导致问题,因为其中任何一个(但不是两个)都可能是()。< / LI>

    虽然你的标题没有说出来,但是你的问题提到这实际上是car发生的,这意味着e中没有发生这种情况,c和{{ 1}}。它发生在d的{​​{1}}或(car ls2)的{​​{1}}。

    如果你使用Dr. Racket来运行你的代码,那么IDE应该突出显示发生错误调用的地方(如this answer中的屏幕截图所示)。

答案 1 :(得分:2)

help函数没有按照您的想象执行,实际上您需要两个帮助程序:

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

如果你不做上述操作,你会发现并非所有的字符都被替换,因为你只遍历常规/加密列表一次,但为了算法工作,你必须遍历它们一次输入消息中的每个字符

答案 2 :(得分: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))))))))