0
使用收率我有產生出置換函數:平衡存儲器和性能在遞歸
def all_perms(str):
if len(str) <=1:
yield str
else:
for perm in all_perms(str[1:]):
for i in range(len(perm)+1):
yield perm[:i] + str[0:1] + perm[i:]
據我所知,yield
需要即時計算而不是存儲在堆上的中間計算結果。這是很好的蟒蛇是not aggressive at freeing up memory。但是it takes longer to calculate。這是否意味着,它每次調用時都必須計算遞歸樹的整個分支?如果是這樣,運行時間的時間複雜度將增加N * log(N),對嗎?
如果確實yield
需要每次計算整個一個分支,則在每個級別上,計算需要按照子級的數量成比例地重複,這在每個級別上相加爲N.並且由於深度是log(N),所以總和爲N * log(N)。這看起來像是一筆過大的交易。當使用yield
或更好的選擇時,有一個很好的經驗法則嗎?