遞歸,顧名思義,自己調用自己的算法。
編寫遞歸函數時,必須告訴它何時停止遞歸。正因為如此,每個遞歸函數都有兩個部分:基線條件(base case)和遞歸條件(recurssive case)。遞歸條件指的是函數調用自己的條件,而基線條件指的是函數不再調用自己,避免無限死循環的條件。
因此使用遞歸的算法一般都能使用循環代替。
(循環)非遞歸效率高;遞歸代碼寫出來思路清晰,可讀性強。
遞歸好處:代碼更簡潔清晰,可讀性更好
遞歸壞處:由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。棧使用先進后出的原則。而且,如果遞歸深度太大,可能系統撐不住。
遞歸有使用的局限性,並不是每一種語言都支持遞歸。
下面是一個階乘的遞歸函數,大家可以用自己的電腦試試100,1000,10000需要的系統性能。
/** * 遞歸計算n 的階乘 * @param n * @return */ public long test(long n){ if(n == 1){ return 1; }else{ return n * test(n-1); } }