5.6 Java递归讲解
- A方法调用B方法,我们很容易理解
- 递归就是:A方法调用A方法!就是自己调用自己
- 利用递归可以实现通过简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
- 递归结构包括两个部分:
- 递归头:什么时候不调用自身方法。如果么有递归头,将陷入死循环
- 递归体:什么时候需要调用自身方法。
递归示意图
例
package com.baidu.www.method;
public class Demo05 {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n){
if(n==1){
return 1;
}else {
return n*f(n-1);
}
}
}
在这个示例中,我们可以看到递归一定要包含递归头,也就是一定要明确什么时候不调用自身方法,让这个递归走到尽头,在示例中递归头就是f(1),到了f(1)之后程序就执行到底了,程序就不会再往下走了。递归的理解我们可以从以下几步来理解
- 明确边界条件,也就是到最后一个数的时候,程序会执行到底
- 还有一个前阶段,如示例中参数不等于1的时候就不停地调用自身,直到等于1。
- 返回阶段,不断地将值返回
这里我们需要知道的是Java是使用**“栈”**机制的,相当于栈的底部是main方法,每次调用一个方法就往上压一个方法,如果每个方法都正常结束,程序就正常运行,main方法执行完之后栈里就空了,但是如果无限的往栈里压方法,空间就不行了,对于一些嵌套层次比较深的算法递归就会显得力不从心了,从物理层面理解就是我们说的内存崩溃。
这里建议是能不用递归就不用,尽量用其他方法来代替,这里学习递归主要是学习递归的思想,就是在解决一些问题时用到这种思想