程序调用自身的编程技巧称为递归。
今天分享几个经典递归算法,也算是做一个整理记录。
/**
* 3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个
* 月的兔子总数为多少?
*/
public static int rabbit(int x){
if (x == 1 || x ==2) {
return 1;
} else {
return rabbit(x - 1) + rabbit(x -2);
}
}
/**
* 从1到100相加
*/
public static int sum(int i) {
if (i == 1) {
return 1;
} else {
return i + sum(i - 1);
}
}
/**
* 从1到100阶乘
*/
public static BigInteger sum_1(int i) {
if (i == 1) {
return BigInteger.ONE;
} else {
return BigInteger.valueOf(i).multiply(sum_1(i - 1));
}
}
/**
* 一列数的规则如下: 1、1、2、3、5、8、13、21、34 ,求第30位数是多少?使用递归实现
*/
public static int test (int i) {
if (i < 2) {
return 1;
} else {
return test(i - 1) + test(i - 2);
}
}
/**
* 汉诺塔问题
*/
public static void hanio (int n, char a, char b, char c) {
if (n == 1) {
System.out.println("移动"+n+"号盘子从"+a+"到"+c);
} else {
hanio(n - 1, a, c, b);
System.out.println("移动"+n+"号盘子从"+a+"到"+c);
hanio(n - 1, b, a, c);
}
}
/**
* n阶台阶,一次走一步或两步,有多少种走法?
*/
public static int findStep (int i) {
if (i == 0 || i == 1 || i == 2) {
return i;
} else {
return findStep(i - 1) + findStep(i - 2);
}
}
/**
* 求最大公约数
*/
public static long gcd (long m, long n) {
while (n != 0) {
long rem = m % n;
m = n;
n = rem;
}
return m;
}
/**
* 二分查找
* @param srcArray 有序数组
* @param start 数组开始位置
* @param end 数组结束位置
* @param key 查找的key
* @return
*/
public static int binSearch (int srcArray[], int start, int end, int key) {
int min = (end - start) / 2 + start;
if (start >= end) {
return -1;
} else if (key > srcArray[min]) {
return binSearch(srcArray, min + 1, end, key);
} else if (key < srcArray[min]) {
return binSearch(srcArray, start, min -1, key);
}
return -1;
}