[英]How does Python evaluate 'and' in a recursive function?
让我们想象一下,我们想要检查列表中的所有元素是否都是正数。 我们可以定义一个函数:
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)'来表达?
你的路线:
return (array[0] > 0) and (check_positive(array[1:]))
将评估array[0] > 0
。 如果为false,则在不调用check_positive
情况下返回false。 如果是,则调用check_positive(array[1:])
。 因此它与第一个示例具有相同的评估顺序。
请注意,尾递归在Python中不是一个有趣的特性,因为Python不进行尾调用优化。
你可以像这样测试它:
arr = [0]*10**6
check_positive(arr)
与此相比,这立即结束:
arr = [1]*10**6
check_positive(arr)
这很慢。
所以你可以得出结论,是的,它是尾递归的。
(这是在python中这样做的可怕方法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.