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,只需要某种方式将递归状态传递给下一个调用即可。