让我们想象一下,我们想检查列表中的所有元素是否为正。我们可以定义一个函数:
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)'?
答案 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中是一种可怕的方式)