计划中的尾递归

时间:2014-09-28 07:05:41

标签: recursion scheme tail-recursion

我正在尝试创建两个函数。一个加密和消息,另一个解密消息。解密的消息将是一个列表,其中元素是表示消息中字母的ascii代码。加密邮件是列表中包含非常大的看似随机数的列表。

以下是我写的两个函数。据我了解,这些函数中的每一个都应该返回一个数字列表。当我尝试解密一条消息时,我得到的最大递归深度超过"消息。

(set! load-noisily? #t)

(define d 157)
(define e 17)
(define n 2773)

(define msg '(2063 193 758 2227 1860 131 131 169 758 660 1528 1751 2227 660 1684 758 2227 660 169 1020 1239 758 207))

(define printasciis (lambda (l)
    (begin (map (lambda (x) (display (ascii->char x))) l)
        (display "\n"))))

(define (makeasciis S) (map (lambda (x) (char->ascii x)) (string->list S)))

(define (encrypt x)
    (remainder (expt m e) n))

(define (decrypt y)
    (remainder (expt c d) n))

(define (encrypt-list lst)
    (if (null? msg) 'done)
        (cons (encrypt (car msg))
            (encrypt-list (cdr msg))))

(define (decrypt-list lst)
    (if (null? msg) 'done)
        (cons (decrypt (car msg))
            (decrypt-list (cdr msg))))

我相信它是因为我的递归函数不是尾递归的。在对这个主题做了一些研究之后,我似乎不得不使用累加器来使它们的尾递归。这就是问题所在。在这个例子中,我似乎无法弄清楚如何做到这一点。

我对计划和编程非常陌生,所以任何帮助都会受到高度赞赏。

编辑:我已经包含了整个代码。

1 个答案:

答案 0 :(得分:1)

您有一些小错误,但最严重的是程序中的变量与给定的参数名称不对应。试试这个:

(define (printasciis l)
  (for-each (lambda (x) (display (ascii->char x))) l)
  (newline))

(define (makeasciis S) 
  (map (lambda (x) (char->ascii x)) 
       (string->list S)))

(define (encrypt x)
  (remainder (expt x e) n))

(define (decrypt y)
  (remainder (expt y d) n))

(define (encrypt-list msg)
  (if (null? msg)
      'done
      (cons (encrypt (car msg))
            (encrypt-list (cdr msg)))))

(define (decrypt-list msg)
  (if (null? msg)
      'done
      (cons (decrypt (car msg))
            (decrypt-list (cdr msg)))))