【问题标题】:Encrypt [Petite Chez Scheme]加密 [Petite Chez 计划]
【发布时间】:2011-03-30 19:33:54
【问题描述】:

我有一个关于我一直在尝试运行的程序的问题。 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

【问题讨论】:

  • 方案很容易调试。步进器在哪一步阻止你?

标签: recursion scheme chez-scheme


【解决方案1】:

问题是在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)
> 

我会把它留在那里:)

【讨论】:

  • 谢谢,这对我帮助很大:)。有人向我指出的另一个问题是,我在帮手的递归调用中减少了公共和私人列表!虽然这返回了加密列表,但它没有返回不在公共列表中的列表的其余部分。
  • @Michele:在 DrScheme(现在已成为 Racket)编辑器中,您的原始错误在整个代码中产生了程序流行,以指示错误发生的位置,以及前面对该点的调用。它使调试变得非常容易。您在什么环境下使用 Scheme?
猜你喜欢
  • 2015-01-19
  • 2018-01-07
  • 2023-03-14
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多