递归的意思就是在运行时自己调用自己本身。一般用递归写出来的代码都比较简短,麻烦的事都交给编译器了。而且递归会大大增加空间复杂度和时间复杂度。因为每一层递归就等于把上一层递归放入了栈里
递归因该具有两个条件:(1)原问题和子问题是一样的问题,(2)要有出口,不能一直调用自己,就是说要跳出递归。
我们最常见的递归就是阶乘,我们要想知道10的阶乘,就必须知道9的阶乘;想知道9的阶乘,必须知道8的阶乘;8的阶乘就要知道7的阶乘......以此类推。实际上就是调用自己的过程。
此外就是汉诺塔问题,是典型的递归调用。
简单探讨一下汉诺塔问题,汉诺塔的原理这里再简单提一下,就是有3根柱子A,B,C。A柱子上由上至下依次由小至大排列的圆盘。把A柱子上的圆盘借B柱子全部移动到C柱子上,并且移动的过程始终是小的圆盘在上,大的在下。
我们先想只有一个圆盘时候的情况就很好理解。在推广到n上,先处理第n、n-1个就好。我们可以先把n-1个圆盘从A借助C成功的移动到B,然后再把第n个圆盘从A移动到C,最后再把n-1个圆盘从B借助A成功的移动到C。同样以此类推。改变里面的参数,就可以解决汉诺塔问题。
然后是斐波那契数列,在王道和许多考研教材里,都用它来讲递归。因为他就是一个很明显的递归函数,看看代码:
public static int fibonacci(int paraN) {
if (paraN <= 0) {
return 0;
} if (paraN == 1) {
return 1;
}
return fibonacci(paraN - 1) + fibonacci(paraN - 2);
}
public static void main(String args[]) {
for(int i = 0; i < 10; i ++) {
System.out.println("Fibonacci " + i + ": " + fibonacci(i));
}
}
其结果为:
总结:递归还是很常用的,在树和图的遍历以及归并排序算法中应用广泛,在图和树那里会详谈。