首先說一下什麼是遞歸,遞歸是解決邏輯或數學問題的一種方法,他一般把一個複雜的問題層層轉化爲一個或者多個性質相同可是規模很小的問題來求解,其基本思想是已「以此類推」。在學習「Fibonacy數列和漢諾塔問題」以前先看一個用遞歸方式計算整數階乘的例子,以此說明遞歸算法中的一些概念:java
遞歸計算4的階乘:算法
public class Factorial{ public int f(int n){ if(n==1){ //這裏就是所謂的遞歸頭 return 1; }else{ int k=f(n-1); //這個就是遞推公式 return n*k; } } public static void main(String []args){ Factorial fact=new Factorial(); int result=fact.f(4); System.out.println(result); } }
最後運行的結果爲「24」,正確。學習
一個遞歸算法裏面須要有兩個語句,一個是「遞歸頭」,遞歸頭的含義能夠理解爲:複雜問題最簡單的形式表現。如上例計算4的階乘問題能夠轉化爲最簡單的問題-------計算1的階乘(就是上例中的if(n==1){return 1;}語句所表達的含義);另外一個是」遞推公式「,好比上例中的 int k=f(n-1) 就是一個遞推公式。只有肯定了正確的遞歸頭和遞推公式,程序纔會正確的執行。spa
下面來看一個經典的遞歸例子(Fibonacy數列問題)問題的描述是:一個數等於其前面相鄰的兩個數的和,具體描述公式以下: a1=1,a2=1;an=an-1+an-2。代碼以下:code
public class TestFibonacty{ public static void main(String []args){ TestFibonacty t=new TestFibonacty(); System.out.println(t.m1(40)) } public int m1(int n){ int p1=1,p2=1,c=0;//p1表示第一個數,p2表示第二個數,c表示兩個相鄰的數的和 if(n==1||n==2){ //遞歸頭 return 1; }else{ int result=m1(n-1)+m2(n-2); //遞推公式 return result; } } }