Function 尾部递归?

Function 尾部递归?,function,scheme,tail-recursion,Function,Scheme,Tail Recursion,我正在写一个函数,它接受一个列表,并返回列表中所有项目的平方和。调用(1233)它应该返回14:(12+22+32) 我有一个sqsum函数: (define (sqsum lis) (if (null? lis) 0 (+ (* (car lis) (car lis)) (sqsum (cdr lis))) ) ) 这条尾巴是递归的吗?我认为它是递归的,但不是尾部递归的。 这是我作业的一部分,我不是在寻找解决方案:我只是想知道这是不是尾部递归。

我正在写一个函数,它接受一个列表,并返回列表中所有项目的平方和。调用(1233)它应该返回14:(12+22+32)

我有一个sqsum函数:

(define (sqsum lis)
    (if (null? lis)
        0
        (+ (* (car lis) (car lis)) (sqsum (cdr lis)))
    )
)
这条尾巴是递归的吗?我认为它是递归的,但不是尾部递归的。
这是我作业的一部分,我不是在寻找解决方案:我只是想知道这是不是尾部递归。如果没有,那么我需要阅读更多内容并找到新的解决方案。

要进行尾部递归,递归必须发生在最后一个函数上,也就是说,你不能对递归调用的结果做任何事情。在这里,您将它传递给+,这使得它非尾部递归。不过,编译器可以对此进行优化,而且自己也很容易做到。

要实现尾部递归,递归必须发生在最后一个函数上,也就是说,你不能对递归调用的结果做任何事情。在这里,您将它传递给+,这使得它非尾部递归。不过,编译器可以对此进行优化,而且自己也很容易做到。

不,它不是尾部递归

使非尾部递归函数tail recursive的一般方法是包含累加器,累加器是一个额外的参数,通过递归调用携带过程的当前求值

顺便说一下,这也是“助手”函数非常有用的地方。一般做法是定义函数,使其不接受累加器,在其中定义一个接受累加器的辅助函数,然后让主函数除了调用辅助函数外几乎不做任何事情。你马上就会明白我的意思了

在您的情况下(如果我正确地记住了我的计划:p):


这是尾部递归,因为任何递归调用所做的最后一件事是立即返回另一个函数的结果,而不修改它。

不,它不是尾部递归

使非尾部递归函数tail recursive的一般方法是包含累加器,累加器是一个额外的参数,通过递归调用携带过程的当前求值

顺便说一下,这也是“助手”函数非常有用的地方。一般做法是定义函数,使其不接受累加器,在其中定义一个接受累加器的辅助函数,然后让主函数除了调用辅助函数外几乎不做任何事情。你马上就会明白我的意思了

在您的情况下(如果我正确地记住了我的计划:p):


这是尾部递归,因为任何递归调用所做的最后一件事是立即返回另一个函数的结果,而不修改它。

只要问问自己,在返回之前,这个函数的最后一个操作是什么-是对sqsum的调用还是+?只要问问自己,这个函数的最后一个操作是什么它返回-这是对sqsum的调用还是+?(define(sqsum x)(define(fxs)(if(null?x)s(f(cdrx)(+(*(carx)(carx))s))))(fx0))这是尾部递归的吗?另外,请参见:(define(sqsum x)(define(fxs)(if(null?x)s(f(cdrx)(+(*(carx)(carx))s))这会是尾部递归的吗?另外,请参见:
(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)
)