一,什麼是遞歸python
在函數中調用自身函數ide
二,楔子函數
從前有座山,山裏有座廟,廟裏有個老和尚講故事,講的什麼呢?從前有座山,山裏有座廟,廟裏有個老和尚講故事,講的什麼呢?從前有座山,山裏有座廟,廟裏有個老和尚講故事,講的什麼呢?從前有座山,山裏有座廟,廟裏有個老和尚講故事,講的什麼呢......這個故事大家不喊停我能講一天!咱們說,生活中的例子也能被寫成程序性能
while True:
story = "
從前有個山,山裏有座廟,廟裏老和尚講故事,
講的什麼呢?
"
print(story)
def story():
s = """
從前有個山,山裏有座廟,廟裏老和尚講故事,
講的什麼呢?
"""
print(s)
while True:
story()
嘗試:經過調用自己(遞歸)的方式測試
def story():
s = """
從前有個山,山裏有座廟,廟裏老和尚講故事,
講的什麼呢?
"""
print(s)
story()
story()
先無論函數最後的報錯,除了報錯以外,咱們能看的出來,這一段代碼和上面的代碼執行效果是同樣的。優化
三,認識遞歸spa
遞歸的定義——在一個函數裏再調用這個函數自己code
如今咱們已經大概知道剛剛講的story函數作了什麼,就是在一個函數裏再調用這個函數自己,這種魔性的使用函數的方式就叫作遞歸。blog
剛剛就已經寫了一個最簡單的遞歸函數。遞歸
遞歸的最大深度——997
正如大家剛剛看到的,遞歸函數若是不受到外力的阻止會一直執行下去。可是咱們以前已經說過關於函數調用的問題,每一次函數調用都會產生一個屬於它本身的名稱空間,若是一直調用下去,就會形成名稱空間佔用太多內存的問題,因而python爲了杜絕此類現象,強制的將遞歸層數控制在了997
def foo(n): print(n) n += 1 foo(n) foo(1)
由此咱們能夠看出,未報錯以前能看到的最大數字就是997.固然了,997是python爲了咱們程序的內存優化所設定的一個默認值,咱們固然還能夠經過一些手段去修改它:
import sys print(sys.setrecursionlimit(100000))
咱們能夠經過這種方式來修改遞歸的最大深度,剛剛咱們將python容許的遞歸深度設置爲了10w,至於實際能夠達到的深度就取決於計算機的性能了。不過咱們仍是不推薦修改這個默認的遞歸深度,由於若是用997層遞歸都沒有解決的問題要麼是不適合使用遞歸來解決要麼是你代碼寫的太爛了
四,遞歸
舉個例子來講明遞歸能作的事情。
例一:
如今大家問我,alex老師多大了?我說我不告訴你,但alex比 egon 大兩歲。
你想知道alex多大,你是否是還得去問egon?egon說,我也不告訴你,但我比武sir大兩歲。
你又問武sir,武sir也不告訴你,他說他比金鑫大兩歲。
那你問金鑫,金鑫告訴你,他40了。。。
這個時候你是否是就知道了?alex多大?
分析一下,這幾我的之間的規律
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40
怎樣寫
def age(n):
if n == 1:
return 40
else:
return age(n-1)+2
print(age(4))