递归对于算法来说算是基础的知识了, 最近在看<数据结构与算法分析 java语言描述> ,遇到相关递归的知识, 故在网络中找点资料,现记录下来. 如有侵权,请告知.
/**
* 阶乘的例子。其实递归递归,从字面上解释就是在方法本身调用自己的方法,或者间接调用;看上面的程序,拿multiply(5)来说:
* n=5;执行 5*multiply(4);
*--------------------
*这时候看multiply(4)
n=4 执行 4*multiply(3);
-------------------
看multiply(3)
n=3,执行 3*multiply(2);
---------------
mulitply(2);
n=2 执行 2*mulitply(1);
这时候,return 1;往上返回
2*1向上返回
3*(2*1)向上返回
4*(3*(2*1)) 向上返回
5*(4*(3*(2*1)) ) = 120
所以程序输出120; S
这事简单的递归的例子;所以可以看出来递归的关键得有递归出口(本体的If语句),还有递归方法
* @param n
* @return
*/
public static int multiply(int n){
if(n==1||n==0){
return n;
}else{
return n*(multiply(n-1));
}
}
/**
* 计算二进制中1的个数,
* N为奇数,其1的个数等于N/2二进制中表示1的个数加1
* 例子:
* num=13
* 1.getBinary(13/2=6)+1; 调用 getBinary(6/2=3)+1 返回2+1 =3
* 2.getBinary(6/2=3); 进入方法 , 调用 getBinary(1)+1 =2;
* 3.getBinary(1)+1; getBinary(1) 返回1 , getBinary(1)+1 实际返回2
* 从 步骤3返回 1+1;
* 再返回到步骤2 ,没有做运算
* 再返回到步骤1
* @param num
* @return
*/
public static int getBinary(int num){
if(num==1)
return 1;
if(0==num%2){//是否为偶数
return getBinary(num/2);
}else{
return getBinary(num/2)+1;
}
}
/**
* 利用位移来解决 n>>1 右移一位,相当与 n/2
* @param n
* @return
*/
public static int getBinary2(int n){
if(n==0){
return n;
}
//为偶数
if(n%2==0){
return getBinary2(n>>1);
}else{
//若N是奇数...等于N/2的二进制中1的个数加1
return getBinary2(n>>1)+1;
}
}