[英]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.