Scheme 我该如何让这条尾巴递归呢?

Scheme 我该如何让这条尾巴递归呢?,scheme,Scheme,我有以下代码: (define (prog1 x y) (let ([rel (related x y)]) (cond [(null? rel) (list x)] [else (cons x (map (lambda (d) (prog1 (neighbour d) y)) rel))]))) 我想做的是尝试并使其具有尾部递归性。我知道我需要做一些事情,比如: (define (prog1 x y) (prog1-iter x y `

我有以下代码:

(define (prog1 x y)
    (let ([rel (related x y)])
      (cond
        [(null? rel) (list x)]
        [else (cons x (map (lambda (d) (prog1 (neighbour d) y)) rel))])))
我想做的是尝试并使其具有尾部递归性。我知道我需要做一些事情,比如:

(define (prog1 x y)
  (prog1-iter x y `()))

(define (prog1-iter x y acc)
  (...
   ))

但我不确定如何从我的代码到这个代码。。。我认为这是因为原版中有一张地图,我不确定如何将其整合到
程序中。有人能给我指一下正确的方向吗

对于本质上是迭代的东西,尾部递归很容易编写。您的函数可能会多次调用自身,因此它并不简单。然而,任何程序都可以进行迭代(例如,您的计算机是一台巨大的迭代机器),因此它可以完成

首先,您的函数不是直接递归的(即,
prog1
不直接调用自身)。相反,
prog1
调用
map
,然后调用您提供的lambda(可能多次),然后调用
prog1
;所以它是间接的。调用
map
不是尾部调用;从
map
到lambda的调用肯定不是尾部调用(它可能需要多次调用);从lambda到
prog1
的调用是尾部调用

因此,当你要求它是“尾部递归”时,我不确定你到底需要什么。您希望从
prog1
到自身的调用链中的每个调用都是尾部调用吗?还是想让程序中的每个调用都成为尾部调用?存在
map
的“尾部递归”版本,但它们仅对从
map
map
的调用是“尾部递归”,而不是对映射函数的调用,因此它们对您的情况没有用


使程序中的每个调用都成为尾部调用的一般方法。基本上,每个函数都有一个附加的函数参数,即“continuation”。而不是对函数进行非尾部调用,而是对其进行尾部调用,并向其传递一个连续性,指定如何处理函数调用的结果。基本上,延续将包含非尾部调用后原始函数的“其余部分”,并将原始非尾部调用的“返回结果”作为参数。我将把它作为如何将您的程序转换为CPS的练习。

查看原始算法可能会有所帮助,如果它是众所周知的,并且存在一个必要的解决方案,则效果会更好。这将使它更容易转换为功能性的尾部递归实现。