遞歸
函數或者方法自己調用自己,
百度中是這樣說的
“一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問題層層轉化爲一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重複計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。”
表面上還是不難理解的,但是如果真正的應用,在檢測遞歸調用的正確性的時候 ,容易把自己繞暈了,就比如這下這個方法吧
public void a(){
//.............
m=a();
n=b();
//.............
}
如果debug進去,還真是把你給繞暈了。
其實理解遞歸關鍵在於理解跳出條件,其實跳出條件跟執行過程有一定數據關聯關係,代碼是其實很好理解當執行到m=A()時,程序重新會進入A()裏面,A()裏面有跳出條 件會作出判斷是否返回,(如果沒有跳出條件程序會不斷進入遞歸,直到內存耗盡,或出現異常。)當條件符合時就會返回數據回到上一層遞歸,在上一層遞歸中接着執行n=A(), 然後同m=A()一樣進行遞歸;
其實整個問題在於結束條件而不在m和n的值,也就是說,只要有一處遞歸可以結束,那麼所有遞歸都是可以結束的,問題只是在於遞歸的次數多少而已。 如果你沒有考慮結束條件,如你可能將內部變量作爲結束條件,這樣是無法結束的,因爲內部變量每次執行遞歸時都是新變量與上層是無關聯的。