解釋器運(yùn)行遞歸
執(zhí)行函數(shù)時(shí),先將函數(shù)中所調(diào)用的函數(shù)壓入棧。所有的函數(shù)壓入棧后,遵循先進(jìn)先出的原則進(jìn)行執(zhí)行。
def print_num(n):
if n > 0:
print_num(n-1)
print(n)
- python的遞歸深度默認(rèn)情況下不超過998,
- 大于998,會(huì)出現(xiàn)“RuntimeError: maximum recursion depth exceeded”,即爆棧錯(cuò)誤。
for循環(huán)
將上述代碼,改寫為for循環(huán)實(shí)現(xiàn)。
def print_num(n):
counter = 0
while counter < n:
print(counter)
counter += 1
這樣改寫之后,不存在壓入棧的問題。每次循環(huán)都是對(duì)counter賦值,節(jié)省了內(nèi)存空間。
退出遞歸函數(shù)
遞歸函數(shù)是先將所需的函數(shù)全部壓入棧之后,再執(zhí)行。它們執(zhí)行的關(guān)系是這樣的:
printN(1000)
printN(999)
printN(998)
...
用return只是返回到這個(gè)棧的上一級(jí)。如果想結(jié)束整個(gè)函數(shù),需要開啟線程,直接用sys.exit。
def find(key):
source = {'奴隸社會(huì)': [
{'非洲': [{'古埃及文明': ['金字塔']}]},
{'亞洲': [{'兩河流域文明': ['漢謨拉比法典']}, {'古印度': ['種姓制度', '佛教的創(chuàng)立']}]},
{'歐洲': [{'希臘': ['希臘城邦', '雅典民主']}, {'羅馬': ['城邦', '帝國的征服與擴(kuò)展']}, {'希臘羅馬古典文化': ['建筑藝術(shù)', '公歷']}]}
]}
wrong = f"不存在關(guān)鍵字:{key}"
q = []
# 進(jìn)行查找
t = threading.Thread(target=i_find, args=[key, source, q])
t.start()
t.join()
def i_find(key, source, q):
"""
:param key:查詢關(guān)鍵字
:param source: 查詢范圍
:param q: 查詢結(jié)果
:return: void
"""
if isinstance(source, dict):
for k in source:
if k == key:
q.append(key)
sys.exit(1)
else:
for item in source[k]:
q.append(k)
i_find(key, item, q)
else:
if key == source:
q.append(key)
sys.exit(1)
這個(gè)函數(shù)用來查找key是否在source中,為了能夠在查找完成后退出,在find函數(shù)
中開啟了一個(gè)線程。