我們在前面的章節中,很多次的看到了在函式中呼叫別的函式的情況,如果乙個函式在內部呼叫了自身,這個函式就被稱為遞迴函式。
❞高斯求和
def sum_number(n):
total = 0
for i in range(1, n+1):
total += i
return total
sum = sum_number(100)
print(sum)
但如果使用遞迴函式來寫
def sum_number(n):
if n <= 0:
return 0
return n+sum_number(n-1)
sum = sum_number(100)
print(sum)
分析一下**
當n小於0的時候,直接給出和值為0,當n大於0時,結果是n加上sum_number(n-1)
。這裡的sum_number(n-1)
又是一次sum_number
函式的呼叫,不過引數的值變成了n-1,要得到sum_number(n)
的值必須等待sum_number(n-1)
的值被計算出來,同樣要得到sum_number(n-1)
的值必須等待sum_number(n-2)
的值,如此一路推算下去,直到sum_number(0)
,因為if語句的存在,它不需要等待sum_number(-1)
的計算了,而是直接給出結果0。然後程式一路返回,直到回到最初的sum_number(n)
,並給出最終結果。
核心思想
每一次遞迴,整體問題都要比原來減小,並且遞迴到一定層次時,要能直接給出結果。
每乙個遞迴程式都要遵循相同的基本步驟:
例如:使用遞迴函式需要注意遞迴深度溢位,在python中,通常情況下,這個深度是1000層,超過將丟擲異常。在計算機中,函式遞迴呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個遞迴時,棧就會加一層,每當函式返回一層,棧就會減一層。由於棧的大小不是無限的,所以遞迴呼叫的次數過多,會導致棧溢位。
可能存在無限遞迴 遞迴
一 什麼樣的問題可以用遞迴來解決?遞迴問題需要滿足的三個條件 1 問題的解可以分解為幾個子問題 資料規模更小的問題 的解 2 問題與子問題,除了資料規模不同,求解思路完全一樣 3 存在遞迴終止條件 不會無限巢狀 二 為什麼使用遞迴?遞迴的優缺點?1.優點 的表達力很強,寫起來簡潔。2.缺點 時間效率...
可能存在無限遞迴 第3章 遞迴
遞迴只是讓解決方案更清晰,並沒有效能上的優勢。實際上,在有些情況下,使用迴圈的效能更好。如果使用迴圈,程式的效能可能更高 如果使用遞迴,程式可能更容易理解。遞迴函式的組成 1.基線條件 base case 即函式不再呼叫自己,從而避免無限迴圈 2.遞迴條件 recursive case 即自己呼叫自...
PHP實現無限極分類之遞迴方法
面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加乙個pid欄位用來區別自己所屬的分類 資料在資料庫中儲存大概是這個樣子,怎麼實現無限極遞迴呢,有兩種常用的做法,遞迴和引用演算法 遞迴演算法 array array array id 1,pid 0,name 河北省 arra...