OOP基本用法是不會碰到遞迴的,但在複雜OOP世界裡 大部分都發生在回傳函式與多重繼承裡面。
遞迴,執行上表面跟迴圈沒差別。但迴圈較為直觀 不容易自己造成,而遞迴則是會不小心在調用時發生 舉個栗子:
產生了死結般的無限遞迴
class mostly:
name="boss1"
def www(self):
print("我是boss1")
class sm(mostly):
name="user1"
def www(self):
print("boss1小弟")
def Show(mostly):
mostly.www()
Show(sm())
Show(sm()) #繼承物件裡已有同個方法 不能同時存在
Show(sm()) 相當於同時呼叫兩個同方法物件,這會促使編輯器同時遞迴同方法(進而產生無限遞迴)。
像昨天學習到MRO(方法解析順序),和super()。就不能同時遞迴
因為在OOP的世界,物件都是獨一無二的。同時有一模一樣的方法,就會因為要呼叫到而無止境的遞迴。
如果遞迴只有缺點,那就不是那麼重要了。
遞迴最大特色就是呼叫自身方法與屬性
Ex:(99乘法表迴圈)
#迴圈
for i in range(1,9):
i +=1
if i+1:
print("\n")
for j in range(0,9):
j+=1
print("%dx%d=" %(i,j) ,i*j, end=" , ")
簡單的99乘法使用迴圈比較簡單
這時用迴圈就沒辦法了,反而用遞迴較簡單
def hanoi(n,a,b,c):
if n == 1:
print(a, "-->" , c)
else:
hanoi(n-1 , a , c , b)
hanoi(1 , a , b , c)
hanoi(n-1 , b , a , c) #遞迴不加return
hanoi(5,'A','B','C') #五環三柱
總結:
迴圈處理簡單資料,較直觀
遞迴主要處理複雜資料,較不直觀
當遞迴呼叫自身物件時,會有一個呼叫限制。
import sys
sys.getrecursionlimit()
得到此編輯器Rmax(遞迴最大值),但不用擔心。只要超過Rmax的話就給他指定新值就好了
import sys
sys.setrecursionlimit(100000000)