Scheme 这条尾巴是递归的吗?

Scheme 这条尾巴是递归的吗?,scheme,tail-recursion,Scheme,Tail Recursion,根据我对尾部递归的理解,以下函数不是尾部递归函数 (define (map f L) (if (null? L) '() (cons (f (car L)) (map f (cdr L))))) cons必须等到(map f(cdr L))返回才能完成其工作。这可以防止它是尾部递归的 我说得对吗?是的 这个答案显然不够长,无法进行堆栈交换 是的,上面有一颗樱桃 是的,它不是尾部递归的 尾部递归是当递归调用处于尾部位置时。生成返回的调用应该是原始函数或类似的互尾递归函数 (d

根据我对尾部递归的理解,以下函数不是尾部递归函数

(define (map f L)
  (if (null? L)
    '()
    (cons (f (car L)) (map f (cdr L)))))
cons
必须等到
(map f(cdr L))
返回才能完成其工作。这可以防止它是尾部递归的

我说得对吗?

是的

这个答案显然不够长,无法进行堆栈交换


是的,上面有一颗樱桃

是的,它不是尾部递归的

尾部递归是当递归调用处于尾部位置时。生成返回的调用应该是原始函数或类似的互尾递归函数

(define (even? int)
  (if (= 0 int) #t (odd? (- int 1))))

(define (odd? int)
  (if (= 1 int) #t
      (if (= 0 int) 
          #f
          (even? (- int 1)))))

可以安全地假设它不是尾部递归的,因为标准(RNRS,包括最新的R7RS)不需要优化

当然,这并不妨碍任何人在他们的方案实现中实际实现TRMCO,因此您对
map
的定义几乎是尾部递归的(除了
cons
),实际上会变成尾部递归的。这种实现可以通过将代码转换为类似于以下代码的内容来实现这一点:

#!r6rs
(import (except (rnrs) map)
        (rnrs mutable-pairs))

(define (map fun lst)
  (define result (cons 'head '()))
  (let loop ((tail result) (lst lst))
    (cond ((null? lst) (cdr result))
          (else (set-cdr! tail (cons (fun (car lst)) '()))
                (loop (cdr tail) (cdr lst))))))

转换非常简单,所以我真的不明白为什么方案实现不会自动完成转换,而Prolog会。它没有实现支持
语法规则
使用当前延续调用所需的复杂度

这是一个正确的答案,但需要一点解释才能让它成为一个真正好的答案…@John,我在[CS课堂讲稿]()中看到这个函数后,对我的结论犹豫不决。我相信你的意思是第二个函数是
奇怪的
。谢谢。
(或(=0 int)(奇数?…)
我没有尝试实现我自己的
映射。这只是一个示例,旨在澄清什么是尾部递归函数,什么不是。不管怎样,谢谢你的回答。@RSahu你知道我说的方案是对的吗?你把你的问题写下来,然后它把它改写成和我的类似的东西?正如Prolog所说,这是完全可行的。不,我想我没有理解你答案的关键。任何关于TRMC的提及都会得到我的自动投票!;)@RSahu这意味着在存在TRMC优化的情况下,编译器会自动将您的代码转换为如图所示的代码,这是尾部递归的。因此,您可以无需担心地编写这样的代码。:)