递归
方法定义中调用方法本身的现象
递归注意事项:
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
构造方法不能递归使用
区别:
方法的嵌套调用,例子:
Math.max(Math.max(a,b),c);
递归,例子:
publi void show(){
show();
}
递归解决问题的方法:分解法 合并法
范例:求阶乘,用代码实现求5的阶乘
package it.cast_01;
/*
* 递归:方法定义中调用方法本身
* 求阶乘,用代码实现求5的阶乘。
* 一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积
* 规律:
* 5! = 1*2*3*4*5
* 5!=5*4!
*实现的方案:
*A / 循环实现
*B / 递归实现
* a : 做递归要写一个方法
* b : 出口条件
* c : 规律
*/
public class DiGuiDemo {
public static void main(String[] args) {
//先用循环实现
int jc =1;
for (int x =2;x<=5;x++){
jc *=x;
}
System.out.println(jc);
//递归实现
System.out.println(jieCheng(5));
}
/*
* 做递归要写一个方法
* 返回值类型:int
* 参数列表 :int n
* 出口条件:
* if(n==1) { return 1;)
* 规律:
* if(n !=1) {return n*方法名(n-1);}
*/
public static int jieCheng(int n){
if(n==1){
return 1;
}
else{
return n*jieCheng(n-1);
}
}
}
练习01:兔子问题(斐波那契数列)
package it.cast_02;
/*
* 递归练习01
* 兔子问题:斐波那契数列 从第三个数开始,每一个数是前两个之和。
*
* 实现的方式:
* 1 / 数组实现
* 2 / 递归实现
*
*/
public class DiGuiTest_01 {
public static void main(String[] args) {
//数组实现
//定义一个数组
int [] arr = new int[20];
arr[0] = 1;
arr[1] =1;
// arr[2] = arr[0] +arr[1];
// arr[3] = arr[1] +arr[2];
// ...
for (int x =2; x<arr.length;x++){
arr[x] = arr[x-2]+arr[x-1];
}
System.out.println(arr[arr.length-1]); //6765
System.out.println("-----------------------------");
//调用递归方法
System.out.println(fib(20));
}
/*方法:
返回值类型:int
参数列表:int n
出口条件:
第一个月是1,第二个月是1;
规律:
从第三个数开始,每个数是前两个数之和
*/
//递归方法
public static int fib(int n){
if (n == 1 || n==2){
return 1;
}
else{
return fib(n-1)+fib(n-2);
}
}
}