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