我正在编写一个获取列表并返回列表中所有项目的平方和的函数。被称为(1 2 3)它应该返回14:(1 2 + 2 2 + 3 2 )。
我有这个sqsum函数:
(define (sqsum lis)
(if (null? lis)
0
(+ (* (car lis) (car lis)) (sqsum (cdr lis)))
)
)
这个尾部是递归的吗?我认为它是递归的,但不是尾递归。 这是我的功课的一部分,我不寻找解决方案:我只是想知道这是否是尾递归。如果没有,那么我需要阅读更多内容并找到新的解决方案。
答案 0 :(得分:4)
要进行尾递归,递归必须在最后一个函数处发生,即你不能对recursiv调用的结果做任何事情。在这里你将它传递给+,这使得它非尾递归。编译器可以对此进行优化,而且自己也很容易做到。
答案 1 :(得分:1)
不,它不是尾递归。
使非尾递归函数尾递归的一般方法是包含一个累加器,它是一个额外的参数,通过递归调用来承载过程的当前评估。
顺便说一句,这也是“帮助”功能非常有用的地方。通常的做法是定义你的函数,使它不取累加器,在其中定义一个辅助函数 取累加器,然后让主函数做除了调用辅助函数之外还有一点点。你会在一秒钟内看到我的意思。
在你的情况下(如果我正确地记住了我的方案:p):
(define (sqsum lis)
(define (sqsum-h lis acc)
(if (null? lis)
acc
(sqsum-h (cdr lis) (+ acc (* (car lis) (car lis))))
)
)
(sqsum-h lis 0)
)
这是尾递归的,因为任何递归调用的最后一件事是立即返回另一个函数的结果而不修改它。