遞歸算法是跟常見的算法思想。使用遞歸算法,每每能夠簡化代碼編寫,提升程序的可讀性。可是,不適合的遞歸每每致使程序的執行效率變低。java
遞歸算法即在程序中不斷反覆調用自身來叨叨求解問題的方法。此處的重點是調用自身,這就要求待求解的問題可以分解爲相同問題的一個子問題。這樣,經過屢次遞歸調用,即可以完成求解。算法
在遞歸方法中,主調方法又是被調方法。執行遞歸方法將反覆調用其自身。每調用一次就進入新的一層。方法的遞歸調用分爲兩種狀況分別爲:人工智能
編寫遞歸方法時,必須使用if語句強制方法在未執行遞歸調用前返回。若是不這樣作,在調用方法後,他將永遠不會返回。這是一個很容易犯的錯誤。spa
在方法中使用遞歸的好處有:程序代碼更簡潔清晰,可讀性更好。有的算法用遞歸表示要比用循環表示簡潔精煉,並且某些問題,特別是與人工智能有關的問題,更適宜用遞歸方法,如八皇后問題、漢諾塔問題等。有的算法,用遞歸能實現,並且循環不必定能實現。code
大部分遞歸例程沒有明顯的減小代碼規模和節省內存空間。遞歸形式比非遞歸形式運行速度要慢一些。這是由於附加的方法調用增長了時間開銷,例如須要執行一系列的壓棧出棧等操做。但在許多狀況下,速度的差異不太明顯。若是遞歸層次太深,還可能致使堆棧溢出。遞歸
遞歸算法經常使用於一些數據計算,或者有明顯的遞推性質問題。理解遞歸最經常使用的一個例子是編寫程序求階乘問題。內存
階乘就是一個正整數的階乘是全部小於及等於該數的正整數的積,而且0的階乘爲1。it
public class algorithm { /** * 遞歸算法階乘 */ public static int fact(int i){ if (i<=1){ return 1; }else { return i*fact(i-1); } } public static void main(String[] args) { /** * 遞歸算法階乘 */ System.out.println(fact(12)); } }
效果以下:class
479001600