方案递归从列表为空后的开头开始

标签 scheme racket

对于一个学校项目,我必须考虑自己的加密方法,并且必须在方案中创建一个程序,它可以用该方法加密和解密。我对方案还很陌生,所以我需要一些帮助。

所以我正在使用递归,正如您在我的代码中看到的那样,正如您所看到的,我将字母转换为数字,然后将字母向上移动键中指定的次数。之后我想将它们转换回字母。所以我的问题是,当 key 为空时,我想从头开始重新使用 key ,但我真的不知道该怎么做。

如果你想进一步帮助我,我想声明第二个键,它由数字组成。该键决定第一个键何时再次从头开始。 我希望你能帮助我!

(define (codieren str ausgabe key1)
  (verschluesseln (umwandeln (string->list str) ausgabe) key1 '()))


(define (umwandeln liste ausgabe)
  (cond
    [(null? liste) ausgabe]
    [else (umwandeln (rest liste)
                   (append ausgabe (list (char->integer (first liste)))))]))

(define (verschluesseln zahlenListe key1 ausgabe)
  (cond
    [(null? zahlenListe) ausgabe]
    [else (verschluesseln (rest zahlenListe) (rest key1)
                          (append ausgabe (list (+ (first zahlenListe) (first key1)))))]))

最佳答案

我已经重命名了一些变量:)

Legend
------
ausgabe        = output
codieren       = encode
verschluesseln = encrypt
umwandeln      = convert
zahlenListe    = numlist

...并添加了一些签名和目的声明。 check-expect s 是 Racket 中的测试 BSL (初级学生语言)。

;; String [Listof Character] [Listof Number] -> [Listof Number]
;; converts, then encrypts str by key1
(define (encode str output key1)
  (encrypt (convert (string->list str) output) key1 '()))

(check-expect (encode "abc" '() (list 1 1 1)) (list 98 99 100))

;; [Listof Character] [Listof Character] -> [Listof Character]
;; converts each character in liste to an integer
(define (convert liste output)
  (cond
    [(null? liste) output]
    [else (convert (rest liste)
                   (append output (list (char->integer (first liste)))))]))

;; [Listof Number] [Listof Number] [Listof Number] -> [Listof Number]
;; increments each number in numlist by key1
(define (encrypt numlist key1 output)
  (cond
    [(null? numlist) output]
    [else (encrypt (rest numlist)
                   (rest key1)
                   (append output (list (+ (first numlist) (first key1)))))]))

您可以构建类似的解码器函数(向后工作):

;; [Listof Number] [Listof Number] [Listof Number] -> String
(define (decode code output key1)
  (list->string (convert-back (decrypt code key1 output) '())))

(check-expect (decode (list 98 99 100) '() (list 1 1 1)) "abc")

;; [Listof Number][Listof Number] [Listof Number] -> [Listof Number]
(define (decrypt numlist key1 output)
  (cond
    [(null? numlist) output]
    [else (decrypt (rest numlist)
                   (rest key1)
                   (append output (list (- (first numlist) (first key1)))))]))

(check-expect (decrypt (list 98 99 100) (list 1 1 1) '()) (list 97 98 99))

;; [Listof Number] [Listof Character] -> [Listof Character]
(define (convert-back liste output)
  (cond
    [(null? liste) output]
    [else (convert-back (rest liste)
                        (append output (list (integer->char (first liste)))))]))

(check-expect (convert-back (list 97 98 99) '()) (list #\a #\b #\c))

然后测试通过 key 编码和解码某些内容是否返回相同的内容:

;; String [Listof Number] -> String
;; encodes and decodes a str by key
(define (encode-decode-identity str key)
  (decode (encode str '() key) '() key))

(check-expect (encode-decode-identity "abc" (list 1 1 1)) "abc")
(check-expect (encode-decode-identity "Gödel" (list 3 0 1 -9 7)) "Gödel")

看看 key 是如何在两个函数中使用的。

请注意,我们的编码消息是[Listof Number]。这可以转换为字符串:

;; [Listof Number] String -> String
;; converts an encoding `code` to its string form
(define (code-to-string code output)
  (cond [(null? code) output]
        [else (code-to-string (rest code)
                              (string-append output (int->string (first code))))]))

(check-expect (code-to-string (list 98 99 100) "") "bcd")
(check-expect (code-to-string (encode "Church" '() (list 4 2 3 -5 0 9)) "") "Gjxmcq")

...然后可以用来多次编码某些内容(如您所要求的):


;; Number String [Listof Number] -> String
;; encodes str n times using key
(define (encode-n-times n str key)
  (cond [(= n 0) str]
        [else (encode-n-times (- n 1) (code-to-string (encode str '() key) "") key)]))

(check-expect (encode-n-times 3 "abc" (list 1 1 1)) "def")

不再是“ key 再次从头开始”,而是组合了多个encode应用程序。

关于方案递归从列表为空后的开头开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56186442/

相关文章:

scheme - 花括号 {} 替换 Racket 中的 'begin'

list - 如何添加到方案中的嵌入式列表?

scheme - 从 a 到 b 的所有整数的总和,我的代码有什么问题?

lambda - 如何仅使用 lambda 表达式在 Racket(或 Scheme)中编写等于谓词

syntax - 将空列表传递给定义类型 : possible?

scheme - 解决方案中的奇数重复

list - 如何在 Scheme 中编写自己的 "list?"程序

postgresql - Racket Server 和 PostgreSQL - BLOB 上传/下载而不保存到内存或磁盘

object - 获取对象的所有字段

recursion - 计算句子中奇数的个数