Day20--递归
Day20--递归
A 方法调用 B 方法容易理解,
递归就是 A 方法调用 A 方法,即自己调用自己。
利用递归可以用简单程序解决复杂问题,通常把大型复杂问题层层转化为与原问题相似的规模较小问题求解,递归策略用少量程序描述解题过程所需多次重复计算,大大减少程序代码量。递归的能力在于用有限语句定义对象的无限集合。
递归结构包括两个部分:
- 递归头,即什么时候不调用自身方法,没有头会陷入死循环;
- 递归体,即什么时候需要调用自身方法。
没有递归头的示例;
package com.liu.www.method;
public class Demo05 {
public static void main(String[] args) {
Demo05 demo05 = new Demo05();
demo05.test();
}
public void test(){
test(); //没有递归头,会陷入死循环!!!!!
}
}
递归图标:(左边的)
例子1:创建能够计算阶乘的方法
package com.liu.www.method;
//计算阶乘
//1!=1
//5!=5*4*3*2*1
public class Demo06 {
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int i){
if(i==1){
return 1; //递归头f(1),程序进行到f(1)就不再进行
}else{
return i*f(i-1);
}
}
/*
f方法解释:
当i=5时,
f(5)=5*f(4)
f(4)=4*f(3)
f(3)=3*f(2)
f(2)=2*f(1)
f(1)=1
*/
}
由例子可知,计算f(5),就要计算f(4)、f(3)、f(2)、f(1)。计算的流程为:
f(5)--->f(4)--->f(3)--->f(2)--->f(1)--->f(2)--->f(3)--->f(4)--->f(5)
奇怪的现象:
上面的f方法,当我输入i=100时,输出结果为0。这是咋回事?
原因:
计算 100 的阶乘结果为 0 是因为整数类型的范围限制。
在 Java 中,int
类型能表示的数据范围是有限的。当计算较大的阶乘时,结果很容易超出int
类型的取值范围,导致数据溢出,最终结果变为 0。
递归只对基数小的例子有用