一 遞歸/for循環(huán)

解釋器運(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è)線程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容