2014-10-28 83 views

回答

1

在「基本」的條件下,你至少可以告訴我們,如果一個函數直接調用自身:

def test(x): 
    return test(x) 

test.__code__.co_name in test.__code__.co_names # true and co_name can't be changed 
test.__name__ in test.__code__.co_names # true but name can be changed 

這用來檢查函數的名稱是由函數引用的全局名稱。

我說「基本」,因爲有很多方法可以解決這個問題。 Lambdas沒有名字,所以他們不會匹配他們綁定的全球名稱。一個函數可以被重命名。內部代碼可以爲函數引用不同的名稱。該函數可以調用第二個函數,這是真正的遞歸函數。並且...

基本上,沒有辦法知道函數是遞歸的。

+0

謝謝,這真的非常有幫助,正是我所期待的。有沒有辦法使用字符串作爲函數名稱?換句話說,我可以做'nm = coolfunction(test .__ name __)'然後'nm(x)'或類似的東西嗎?我覺得像這樣,你提到的一些問題可以通過創建一個函數調用圖來解決。 – user3475234 2014-10-28 05:23:18

+0

做了一些研究之後,我看到'coolfunction == getattr'。謝謝你的幫助。 – user3475234 2014-10-28 05:31:55

1

有沒有一般的方法來證明一個計算機程序完成(它被證明有程序,你不知道)。幸運的是,實際上有靜態分析工具,可以爲大多數小程序做到這一點。

此外,對於大多數Python函數來說,它明顯具有什麼樣的複雜性(對於受過教育的程序員而言),或者在文檔中提及了使用哪種算法。

如果你對細節感興趣,你應該閱讀一兩本有關算法的書。你也可以看看https://cs.stackexchange.com/,這是一個更適合一般討論不同算法的計算複雜度的網站。

+0

對不起,如果我不清楚,但這不是問題 - 我說我想使用該程序完成的假設,並且它不是一個不正確的函數。不是爲了證明這一點。我想以編程方式確定函數是使用遞歸還是循環。我意識到這可能是不可能的,但這是真正的問題。我知道你不能以編程方式確定一個函數是否結束,但我想這可能是一個不同的問題(可能通過查看堆棧或其他東西)。 – user3475234 2014-10-28 04:16:43

相關問題