python函式(遞迴函式)
阿新 • • 發佈:2020-12-01
在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式
# def ss(x): #定義一個函式 # if x==1: #判斷引數是否等於1 # return x #引數等於1 輸出引數 # return x+ss(x-1) # 引數不等於1 引數加上函式ss(x-1),x-1為函式的新引數 ,迴圈判斷 直到引數為結束 # print(ss(3))
遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰
使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。
解決遞迴呼叫棧溢位的方法是通過尾遞迴優化,事實上尾遞迴和迴圈的效果是一樣的,所以,把迴圈看成是一種特殊的尾遞迴函式也是可以的
遺憾的是,大多數程式語言沒有針對尾遞迴做優化,Python直譯器也沒有做優化,所以,即使把上面的fact(n)
函式改成尾遞迴方式,也會導致棧溢位
小結
使用遞迴函式的優點是邏輯簡單清晰,缺點是過深的呼叫會導致棧溢位。
針對尾遞迴優化的語言可以通過尾遞迴防止棧溢位。尾遞迴事實上和迴圈是等價的,沒有迴圈語句的程式語言只能通過尾遞迴實現迴圈。
Python標準的直譯器沒有針對尾遞迴做優化,任何遞迴函式都存在棧溢位的問題。