------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1. 是什么?
(1)方法定义中调用方法本身的现象叫做递归
(2)有什么用?
把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
2. 怎么用?
如何使用递归:
A:递归必须要有出口
B:递归的表达式
3. 什么时候用?
案例
A:求阶乘
/**
* 5! = 5*4!
* 5*4*3!
* 5*4*3*2!
* 5*4*3*2*1!
* 你知道的1!=1
*
* 你只要知道:
* 递归的出口:1!=1
* 递归的式子:n! =n*(n-1)!
*/
public static intgetTotal(int m){ //m=5
if(m==1){
return 1;
}
else{
returnm*getTotal(m-1);
/*
* 5*getTotal(4) 24
* 4*getTotal(3) 6
* 3*getTotal(2) 2
* 2*getTotal(1) 1
*/
B:求斐波纳契数列的第二十项的值
斐波纳契数列:
* 1,1,2,3,5,8,13,21...
*
* 分析数列规律:
* 第一项和第二项是1。
* 从第三项开始:每一项是前两项之和。
*
public class DiGuiDemo2 {
public static voidmain(String[] args) {
//定义数组来实现
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for(int x=2; x<arr.length; x++){
arr[x] =arr[x-1]+arr[x-2];
}
System.out.println("斐波纳契数列的第二十项的值是:"+arr[19]);
//不用数组做
int a = 1;
int b = 1;
for(int x=0; x<18; x++){
//用一个临时变量存储a的值
int temp = a;
a = b;
b = temp + b;
}
System.out.println("斐波纳契数列的第二十项的值是:"+b);
//用递归做
System.out.println("斐波纳契数列的第二十项的值是:"+getFib(20));
}
/**
* 递归的出口:第一项和第二项的值都是1 a b
* 递归的表达式:第三项开始:是前两项之和 a+b
*/
public static int getFib(intm){
if(m==1 || m==2){
return 1;
}
else{
returngetFib(m-1)+getFib(m-2);
}
}
4. 有什么特点?
(1)递归的注意事项
A:递归次数不要太多
B:递归必须有出口
5. 图解递归5的阶乘