Lisp 是否为尾部递归函数

Lisp 是否为尾部递归函数,lisp,scheme,tail-recursion,Lisp,Scheme,Tail Recursion,有人能帮我吗 (define f (lambda (x) (cond ((null? x) 0) (#t (+ (* (car x) (car x)) (f (cdr x))))))) 我不明白这个函数是不是尾部递归的? 如果是,原因是什么?它不是尾部递归,因为函数在返回之前做的最后一件事是计算(+…)。为了实现尾部递归,返回之前的最后一个操作必须是递归调用 使函数尾部递归通常涉及采用累加器参数的辅助函数: (define f0 (lambda (x acc) (if

有人能帮我吗

(define f (lambda (x)
  (cond
    ((null? x) 0)
    (#t (+ (* (car x) (car x)) (f (cdr x)))))))
我不明白这个函数是不是尾部递归的?
如果是,原因是什么?

它不是尾部递归,因为函数在返回之前做的最后一件事是计算
(+…)
。为了实现尾部递归,返回之前的最后一个操作必须是递归调用

使函数尾部递归通常涉及采用累加器参数的辅助函数:

(define f0 (lambda (x acc)
  (if (null? x)
      acc
      (f0 (cdr x) (+ acc (* (car x)(car x)))))))

(define f (lambda (x)
  (f0 x 0)))

它不是尾部递归的,因为函数在返回之前做的最后一件事是计算
(+…)
。为了实现尾部递归,返回之前的最后一个操作必须是递归调用

使函数尾部递归通常涉及采用累加器参数的辅助函数:

(define f0 (lambda (x acc)
  (if (null? x)
      acc
      (f0 (cdr x) (+ acc (* (car x)(car x)))))))

(define f (lambda (x)
  (f0 x 0)))

不,在等待(f(cdr x))求值时,必须将(*(car x)(car x))的结果保留在堆栈上。在尾部调用中,您可以将其丢弃并得到相同的答案。不,您必须在堆栈上保留(*(car x)(car x))的结果,同时等待(f(cdr x))进行评估。在尾部调用中,你可以扔掉它,得到相同的答案。嘿,你能提供尾部递归代码吗?这样我就能更容易地理解它了。我现在明白了。非常感谢。你不需要一个aculumulator本身,只需要一些方法来将递归状态传递给下一个调用。嘿,你能提供尾部递归代码吗,这样我就可以更容易地理解它。我现在明白了。非常感谢。您本身不需要aculumulator,只需要某种方式将递归状态传递给下一个调用即可。