簡體   English   中英

Python如何在遞歸函數中評估'和'?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM