递归
函数自己调用自己的一个过程。在解决一个数量级较大的问题时,通常将量级降低,分成多个子问题,由小到大解决问题。符合我国古话所说的“大事化小”的一个原则。
递归条件
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,要有个出口,简化为非递归情况处理,否则会出现死循环的问题,如:
public static void test(){
System.out.println("1");
test();
}
递归的简单应用
斐波拉契
public static int fibo(int num){
// 首先判断传入参数是否为大于0的数
if (num >= 0){
// 当num = 0时 则返回0
if (num == 0){
return 0;
// 当num = 1时,返回1
}else if (num == 1){
return 1;
// 当num > 1时,进行函数本身自调用将问题细分为几个子问题
}else {
return fibo(num - 1) + fibo(num - 2);
}
}else {
return -1;
}
}
斐波拉契数列问题递归的出口为num = 0或num = 1。
阶乘
public static int factorial(int num){
// 当传入参数为负数时,返回-1进行参数错误的提醒
if (num < 0){
return -1;
// 当参数为 0 时,返回0
}else if (num == 0){
return 0;
// 当参数为 1 时,返回1。
}else if (num == 1){
return 1;
// 当参数大于 1 时,返回num * factorial(num - 1),进行自调用
}else {
return num * factorial(num - 1);
}
}
递归出口为num = 1。
递归原理分析
当一个问题很大,一步不能计算出来的时候,我们就将这个问题细分为两个或多个子问题(子问题必须和原问题是同一个事),直到我们将问题细分为我们能直接解决的子问题为止,计算出能解决子问题后将答案返回到上一层,最终计算出原问题。