Python如何在递归函数中求和?

时间:2019-03-31 20:03:33

标签: python

让我们想象一下,我们想检查列表中的所有元素是否为正。我们可以定义一个函数:

def check_positive(array):
    if not array:
        return True
    else:
        if array[0] <= 0:
            return False
        else:
            return check_positive(array[1:])

此函数是尾递归的。 编写此函数的另一种方法如下:

def check_positive(array):
    if not array:
        return True
    else:
        return (array[0] > 0) and (check_positive(array[1:])

此函数也是尾递归吗?

我想,我要问的是您是否要求Python进行评估:

True and (f(x))

是先评估f(x)然后评估True and (whatever is the result of f(x)),还是先评估True and f(x)等于'f(x)'并通过评估'f结束对表达式的评估(x)'?

2 个答案:

答案 0 :(得分:3)

您的行:

return (array[0] > 0) and (check_positive(array[1:]))

将评估array[0] > 0。如果为假,它将返回假,而不调用check_positive。如果为true,则它将调用check_positive(array[1:])。因此,它的评估顺序与第一个示例相同。

请注意,尽管尾部递归在Python中并不是一个有趣的特征,因为Python不会进行尾部调用优化。

答案 1 :(得分:0)

您可以像这样测试它:

arr = [0]*10**6
check_positive(arr)

与之相比,这立即结束了:

arr = [1]*10**6
check_positive(arr)

这很慢。

所以您可以得出结论,是的,它是尾递归的。

(这在python tho中是一种可怕的方式)