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.     }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章