Схема рекурсии начинается с начала списка после его пустой - PullRequest
2 голосов
/ 17 мая 2019

Для школьного проекта мне нужно подумать о моем собственном методе шифрования и создать схему по схеме, которая может шифровать и дешифровать этим методом.Я совершенно новичок в схеме, поэтому мне нужно немного помочь.

Итак, я работаю с рекурсией, как вы видите в моем коде, и, как вы можете видеть, я конвертирую буквы в числа, а затем яЯ перемещаю буквы вверх столько раз, сколько указано в ключе.После этого я хочу преобразовать их обратно в буквы.Поэтому моя проблема в том, что я хочу начать с ключа снова с самого начала, когда он пуст, но я не знаю, как это сделать.

Если вы хотите помочь мне еще больше, я хочу объявить второй ключ, который состоит из цифр.Этот ключ решает, когда первый ключ начинается с начала снова.Я надеюсь, что вы можете помочь мне!

(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)))))]))

1 Ответ

4 голосов
/ 17 мая 2019

Я переименовал некоторые переменные:)

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

... и добавил некоторые подписи и операторы цели.check-expect s - это тесты в BSL (Beginning Student Language) Ракета.

;; 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))

И затем проверьте, возвращает ли кодирование и декодирование чего-либо по ключу одно и то же:

;; 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")

Посмотрите, как клавиша только что использовалась в двух двух функциях.

Примечаниечто наше закодированное сообщение было [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")

Вместо "запускается ключ"с самого начала снова "составляются несколько приложений кодирования.

...