递归 n的阶乘

来源:互联网 发布:seajs require其他js 编辑:程序博客网 时间:2024/04/30 04:46

1. 递归算法解题步骤 

(1) 分析问题、寻找递归关系。找出大规模问题和小规模问题的关系。 
(2) 找出停止条件,控制递归。 
(3) 设计函数、确定参数。
 

  1.      * 阶乘的例子。其实递归递归,从字面上解释就是在方法本身调用自己的方法,或者间接调用;看上面的程序,拿multiply(5)来说: 
  2.      *  n=5;执行 5*multiply(4);  
  3.      *--------------------  
  4.      *这时候看multiply(4)  
  5.       n=4 执行 4*multiply(3);  
  6.       -------------------  
  7.       看multiply(3)  
  8.       n=3,执行 3*multiply(2);  
  9.       ---------------  
  10.       mulitply(2);  
  11.       n=2 执行 2*mulitply(1);  
  12.       这时候,return 1;往上返回  
  13.       2*1向上返回  
  14.       3*(2*1)向上返回  
  15.       4*(3*(2*1)) 向上返回  
  16.       5*(4*(3*(2*1)) ) = 120  
  17.     所以程序输出120; S 
  18.     这事简单的递归的例子;所以可以看出来递归的关键得有递归出口(本体的If语句),还有递归方法 
  19.      * @param n 
  20.      * @return 
  21.      */  
  22.     public static int multiply(int n){  
  23.         if(n==0){  
  24.             return 1;  
  25.         }else{  
  26.             return n*(multiply(n-1));  
  27.         }  
  28.     }  
  29.       
  30.       
  31.     /** 
  32.      * 计算二进制中1的个数, 
  33.      * N为奇数,其1的个数等于N/2二进制中表示1的个数加1 
  34.      * 例子: 
  35.      * num=13 
  36.      * 1.getBinary(13/2=6)+1;   调用 getBinary(6/2=3)+1 返回2+1 =3 
  37.      * 2.getBinary(6/2=3); 进入方法 , 调用 getBinary(1)+1 =2; 
  38.      * 3.getBinary(1)+1;  getBinary(1) 返回1 , getBinary(1)+1  实际返回2 
  39.      *  从     步骤3返回 1+1; 
  40.      *  再返回到步骤2 ,没有做运算 
  41.      *  再返回到步骤1  
  42.      * @param num 
  43.      * @return 
  44.      */  
  45.     public static int getBinary(int num){  
  46.         if(num==1)  
  47.             return 1;  
  48.         if(0==num%2){//是否为偶数  
  49.             return getBinary(num/2);  
  50.         }else{  
  51.             return getBinary(num/2)+1;  
  52.         }  
  53.     }  
  54.       
  55.     /** 
  56.      * 利用位移来解决  n>>1 右移一位,相当与 n/2 
  57.      * @param n 
  58.      * @return 
  59.      */  
  60.     public static int getBinary2(int n){  
  61.         if(n==0){  
  62.             return n;  
  63.         }  
  64.         //为偶数   
  65.         if(n%2==0){  
  66.             return getBinary2(n>>1);  
  67.         }else{  
  68.             //若N是奇数...等于N/2的二进制中1的个数加1  
  69.             return getBinary2(n>>1)+1;  
  70.         }  
  71.     }