Recursion 格式中的尾部递归

Recursion 格式中的尾部递归,recursion,scheme,tail-recursion,Recursion,Scheme,Tail Recursion,我试图创建两个函数。一个对消息进行加密和解密,另一个对消息进行解密。解密的消息将是一个列表,其中的元素是代表消息中字母的ascii码。加密邮件是一个列表,列表中有非常大的看似随机的数字 下面是我编写的两个函数。我的理解是,每个函数都应该返回一个数字列表。当我试图解密一条消息时,我得到一条“超过最大递归深度”的消息 我相信这是因为我的递归函数不是尾部递归的。在对这个主题做了一些研究之后,我似乎不得不使用累加器来使它们尾部递归。问题就在这里。对于这个例子,我似乎不知道该怎么做 我对scheme和编程

我试图创建两个函数。一个对消息进行加密和解密,另一个对消息进行解密。解密的消息将是一个列表,其中的元素是代表消息中字母的ascii码。加密邮件是一个列表,列表中有非常大的看似随机的数字

下面是我编写的两个函数。我的理解是,每个函数都应该返回一个数字列表。当我试图解密一条消息时,我得到一条“超过最大递归深度”的消息

我相信这是因为我的递归函数不是尾部递归的。在对这个主题做了一些研究之后,我似乎不得不使用累加器来使它们尾部递归。问题就在这里。对于这个例子,我似乎不知道该怎么做

我对scheme和编程都是新手,所以非常感谢您的帮助


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

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

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

请张贴这两个附加程序。同时,使发布的代码可运行(与
lst
msg
不匹配)。还有一些例子也很有用。@uselpa我认为OP只是想学习如何编写(本质上)map@ChrisJester-Young的尾部递归版本。不过,我们不应该猜测。但是他的代码不应该无休止地递归,而应该阻塞
(cdr null)
。所以我猜错误在他没有发布的过程中。@uselpa True,最好确保我们没有处理XY问题。也许他在某处有一个全局
msg
(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)))))