尾递归功能与否

时间:2013-07-29 21:27:20

标签: lisp scheme tail-recursion

有人可以帮我这个吗?

(define f (lambda (x)
  (cond
    ((null? x) 0)
    (#t (+ (* (car x) (car x)) (f (cdr x)))))))

我无法理解这个函数是否是尾递归的? 如果是,那是什么原因?

1 个答案:

答案 0 :(得分:4)

这不是尾递归,因为函数在返回之前做的最后一件事是评估(+ ...)。为了进行尾递归,返回之前的最后一个操作必须是递归调用。

使函数尾递归通常涉及一个辅助函数,它接受一个累加器参数:

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

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