Java 算法基礎 -遞歸

  1. /** 
  2.      * 階乘的例子。其實遞歸遞歸,從字面上解釋就是在方法本身調用自己的方法,或者間接調用;看上面的程序,拿multiply(5)來說: 
  3.      *  n=5;執行 5*multiply(4);  
  4.      *--------------------  
  5.      *這時候看multiply(4)  
  6.       n=4 執行 4*multiply(3);  
  7.       -------------------  
  8.       看multiply(3)  
  9.       n=3,執行 3*multiply(2);  
  10.       ---------------  
  11.       mulitply(2);  
  12.       n=2 執行 2*mulitply(1);  
  13.       這時候,return 1;往上返回  
  14.       2*1向上返回  
  15.       3*(2*1)向上返回  
  16.       4*(3*(2*1)) 向上返回  
  17.       5*(4*(3*(2*1)) ) = 120  
  18.     所以程序輸出120; S 
  19.     這事簡單的遞歸的例子;所以可以看出來遞歸的關鍵得有遞歸出口(本體的If語句),還有遞歸方法 
  20.      * @param n 
  21.      * @return 
  22.      */  
  23.     public static int multiply(int n){  
  24.         if(n==1||n==0){  
  25.             return n;  
  26.         }else{  
  27.             return n*(multiply(n-1));  
  28.         }  
  29.     }  
  30.       
  31.       
  32.     /** 
  33.      * 計算二進制中1的個數, 
  34.      * N爲奇數,其1的個數等於N/2二進制中表示1的個數加1 
  35.      * 例子: 
  36.      * num=13 
  37.      * 1.getBinary(13/2=6)+1;   調用 getBinary(6/2=3)+1 返回2+1 =3 
  38.      * 2.getBinary(6/2=3); 進入方法 , 調用 getBinary(1)+1 =2; 
  39.      * 3.getBinary(1)+1;  getBinary(1) 返回1 , getBinary(1)+1  實際返回2 
  40.      *  從     步驟3返回 1+1; 
  41.      *  再返回到步驟2 ,沒有做運算 
  42.      *  再返回到步驟1  
  43.      * @param num 
  44.      * @return 
  45.      */  
  46.     public static int getBinary(int num){  
  47.         if(num==1)  
  48.             return 1;  
  49.         if(0==num%2){//是否爲偶數  
  50.             return getBinary(num/2);  
  51.         }else{  
  52.             return getBinary(num/2)+1;  
  53.         }  
  54.     }  
  55.       
  56.     /** 
  57.      * 利用位移來解決  n>>1 右移一位,相當與 n/2 
  58.      * @param n 
  59.      * @return 
  60.      */  
  61.     public static int getBinary2(int n){  
  62.         if(n==0){  
  63.             return n;  
  64.         }  
  65.         //爲偶數   
  66.         if(n%2==0){  
  67.             return getBinary2(n>>1);  
  68.         }else{  
  69.             //若N是奇數...等於N/2的二進制中1的個數加1  
  70.             return getBinary2(n>>1)+1;  
  71.         }  
  72.     }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章