JAVA小案例-递归:计算n!
首先抛出概念,什么是递归?
说白了就是自己调用自己。
递归的结构:
(1)递归头:就是什么时候不调用自身的方法,也就是递归结束的条件
(2)递归体:就是什么时候需要自身调用自身方法,调用的时候是怎么调用的
概念有点抽象,直接看例子:
public class Digui {
/**
* 递归:计算n!
* @param args
*/
public static void main(String[] args) {
long d1 = System.currentTimeMillis();
System.out.printf("%d阶乘的结果:%s%n",10,factorial(10));
//printf的用法,这么整就省的打好几次引号了
//%d代表放前边的东西,就是10
//%s代表放后边的东西,就是factorial(10)
//%n是换行,也可以用\n
long d2 = System.currentTimeMillis();
System.out.printf("递归费时:%s%n",d2-d1);
}
static long factorial(int n){
if (n==1){ //递归头
return 1;
}else { //递归体
return n*factorial(n-1); //n*(n-1)
//从递归头开始,判定n如果等于1,就结束,否则走else分支,走分支的时候,走到return,在这里发生了递归,就是自己调自己
//在开头的main方法里,设定的入参是10,说明要算的是10的阶乘,n最开始是10,第一次走到return发生递归后,n就变成9了
//这个东其实可以理解成函数f(x),第一次是f(10),递归一次后变成10*f(9),说白了就是n*(n-1),一直循环运行
//一直循环到n=1时,走if分支,结束,这个时候递归整体过程就变成10*9*8*7*6*5*4*3*2*1了
}
}
}
结果如下:
- 阶乘应该不用再过多解释了吧我敲!比如3!,就是3的阶乘,就3×2×1。
- 首先说一下例子里边的static,这个叫静态,如果没有它,我们在一个方法中调用另一个没有定义static的方法的话,是需要先创建一个对象的,就是new,然后才能调用这个没有定义static的方法。有了static之后,不用创建对象也能直接调用。
System.currentTimeMillis();
这个勾八东西是啥呢?这个实际上就是获取当前时间,递归前递归后各运行一次,一做差,递归的耗时就出来了
那么为什么要整个计时的东西呢?其实这个递归这个东西不太好,瞅着代码挺简单,但是挺耗费资源,也费时,但是有些时候避免不了得用它。
但是对于这个例子完全可以用循环语句来做,其实耗时很少,也不复杂,就是代码多点,如下:
public class Xunhuanjiecheng {
/**
* 用循环来做阶乘
* @param args
*/
public static void main(String[] args) {
long d3 = System.currentTimeMillis();
int a = 10;
int result = 1;
while(a>1){ //a只要大于1就一直循环
result = result*a*(a-1);
a=a-2;
}
long d4 = System.currentTimeMillis();
System.out.println(result);
System.out.printf("普通循环用时:%s%n",d4-d3);
}
}
可以发现算的很快,基本不费时间
总结一句话,这个递归能不用就不用,实在没招了再用,用循环还快还省内存。