1. 程式人生 > >[18/11/22]遞迴(自己呼叫自己)

[18/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 }