- A方法调用B方法,我们很容易理解!
递归就是:A方法调用A方法!就是自己调用自己
- 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为
一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所
需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象
的无限集合。
- ==递归结构包括两个部分:
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
递归体:什么时候需要调用自身方法。==
错误实例
- 控制台报错StackOverflowError栈溢出了, 什么意思 自己调用自己,电脑内存不够了 栈溢出,非常可怕的一个异常不要这样搞,他不是这样使用的!
- 那么为何还要用递归呢?
2.1.能解释一些东西,能解决一些问题
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.test();
}
//这个方法他没有头会进入死循环,出不来不停的调用停止不来
public void test(){
test();
}
}
正确实例
学过阶乘吧
2! 2x1
3! 3x2x1
5!5x4x3x2x1
public class Demo {
public static void main(String[] args) {
System.out.println(f(5));
}
//传几就调用几直到调用到1为止
// 1!1 还是1的本身数字
// 2!2*1 直到调用到1为止
// 5!5*4*3*2*1 直到调用到1为止
//假设:2! 传递的参数是2那么他进入的是else方法因为传递参数不等于1,1!传递的参数是1他就进入的是if的方法因为传递等于1
public static int f(int n){
// 2!2*1
// 3!3*2*1
// 4!4*3*2*1
// 5!5*4*3*2*1
//一层一层的往上调直到传递的参数等于1时才会结束返回1
//判断如果这个n传递的参数等于1的时候就让他等于1,因为1的阶乘就是他的本身
if(n == 1){
return 1;
}else{
//传递参数不等于1会进入这个方法
//列:return n*f(n-1)
//n就是传递过来的参数2
//*f(n-1)在调用自己的方法f(int n)
//2*f(n-1)不就是2*f(2-1) = f(1) = 1
//所以返回结果2*f(1) = 2, 就相当于2*1 = 2
return n*f(n-1);//结果就是:2*f(2-1) = 2
}
}
}
递归图文