[18/11/22]遞迴(自己呼叫自己)
阿新 • • 發佈:2018-11-22
1、用非遞迴計算10的階乘
程式碼示例:
1 //用迴圈求10的階乘 2 public class Test_1122_01 { 3 public static void main(String args[]){ 4 long d1=System.currentTimeMillis();//獲取系統 以毫秒為單位的當前時間 5 int n=10,result=1; 6 while(n>1){ //核心程式碼 當n=10時 滿足條件n>1,計算 result=1*10*9=90 然後n-2=8 滿足n>1 計算 90*8*7的值 以此類推 ,7 result=result*n*(n-1);// 直到n=0時不滿足條件,退出迴圈 8 n=n-2; 9 } 10 long d2=System.currentTimeMillis(); 11 System.out.println(d2-d1); //計算差值看運算花費了多少時間 結果為一般為0 說明很快 12 System.out.println("result="+result); 13 14 }
2、用遞迴計算10的階乘
程式碼示例:
1 //用遞迴計算10的階乘 2 public class Test_1122_02 3 { 4 public static void main(String[] args) 5 { 6 long d1=System.currentTimeMillis();//獲取時間 7 System.out.println("result= "+fun(10));//開始呼叫方法 fun() 8 long d2=System.currentTimeMillis(); 9 System.out.println(d2-d1); //輸出結果會比迴圈大一點 10 11 } 12 13 static int fun(int n){ 14 if(n==1){ //遞迴頭,從這裡結束,沒有頭將會陷入死迴圈 15 return 1; 16 }else{ //遞迴體,從這裡呼叫 17 return n*fun(n-1); //相當於10*fun(9)=10*9*fun(8)=.......10*9*......2*fun(1)【此時fun(9)、fun(8)、..尚未計算完成】 18 } //由於fun(1)=1,逆序倒過去,fun(2)=2*fun(1)=2*1=2 fun(3)=3*fun(2)=3*2=6,以此類推 19 } // 【fun(2),fun(3)....fun(9)依次計算完成】,返回結果 20 }
總結:
遞迴是一種常見的解決問題的方法,即把問題逐漸簡單化。遞迴的基本思想就是“自己呼叫自己”,一個使用遞迴技術的方法將會直接或者間接的呼叫自己。
利用遞迴可以用簡單的程式來解決一些複雜的問題。比如:斐波那契數列的計算、漢諾塔、快排排序等問題。
遞迴呼叫會佔用大量的系統堆疊,記憶體耗用多。
任何能用遞迴解決的問題也能使用迭代(迴圈)解決。
擴充套件:用遞迴求斐波那契數列
1 public class Test_1122_03 2 { 3 public static void main(String[] args) 4 { 5 int count=0; 6 for(int i=1;i<=20;i++){//輸出前20個斐波那契數,左對齊,10個數換1行 7 System.out.printf("%-6d",fun(i)); 8 count++; 9 if(count%10==0) 10 System.out.println(); 11 } 12 } 13 14 static int fun(int n){ // 規律 | fun(1) fun(2) fun(3) fun(4) fun(5) .....fun(n) 15 if(n==1||n==2){ 16 return 1; //遞迴體出口 | 1 1 2 3 5 ..... fun(n-2)+fun(n-1) (n>=3) 17 }else{ 18 return fun(n-2)+fun(n-1); 19 20 } 21 } 22 }