递归的特点: 自己调用自己
例子:
static int b=0
static void a() {
System.out.println("a");
b++;
if(b<10){
a();
}else{
return;
}
}
注意:static的方法只能用static的变量,利用return结束的功能结束递归
计算n!并获取所花费的时间(递归):
public class Test {
public static void main(String[] args) {
long d1 = System.currentTimeMillis();
System.out.printf("%d阶乘的结果:%s%n", 10, factorial(10));
long d2 = System.currentTimeMillis();
System.out.printf("递归费时:%s%n", d2-d1); //耗时:32ms
}
//求阶乘的方法
static long factorial(int n){
if(n==1){//递归出口
return 1;
}else{//递归体
return n*factorial(n-1);//利用n! = n * (n-1)!
}
}
}
分析:System.currentTimeMillis();返回值类型为long,返回当前时间的毫秒数(因为本质上每个时间都是一个数字),利用这个东西可以用来得到方法的执行时间,相减的结果单位为毫秒。
注意用%s返回长整形数字,%n表示的是换行符也可以写成\n
Java中用printf来按照指定格式进行打印,有些情况下比用字符串拼接方便一点。
注意: 任何能用递归解决的问题也能用循环解决,尽量避免用递归,又花时间,还花内存
用循环来算阶乘以及耗时情况
public class test {
public static void main(String[] args) {
int a=10;
int result=1;
long d1=System.currentTimeMillis();
while(a>1) {
result*=a*(a-1);
a-=2;
}
long d2=System.currentTimeMillis();
System.out.println("阶乘结果:"+result );
System.out.printf("循环耗时:%s%n", d2-d1);//循环耗时:0,说明太快了
}
}