一,递归就是“自己调用自己”的方法
在递归过程中,必须要设置递归头和递归尾;
递归头:什么时候停止调用自己。
递归体:什么时候开始调用自己。
二.这样的调用不是递归
例1:
public class Recursion {
public static void main(String[] args) {
method1();
}
static int index =10;
static void method1() {
System.out.println("a");
for(int i =0;i<index;i++) {
method1();
}
}
}
当在main方法中调用method1方法中,方法体本身中也调用了method1本身这个方法,但是当重新调用method1方法时,for循环中也被重复的初始化,所以这是一个死循环。
例2:
public class Recursion {
public static void main(String[] args) {
method1();
}
static int index =0;
static void method1() {
System.out.println("a");
if(index<10) {//递归体:什么时候调用自己
method1();
}else { //递归头:什么时候不调用自己
return;
}
index++;
}
}
在这个method1方法第一次调用中,当执行到递归体时,就会产生递归,调用自己的method1方法,导致index++无法执行,所以这也是一个死循环。
例2修改:
public class Recursion {
public static void main(String[] args) {
method1();
}
static int index =0;
static void method1() {
System.out.println("a");
index++;
if(index<10) {//递归体:什么时候调用自己
method1();
}else { //递归头:什么时候不调用自己
return;
}
}
}
自己调用自己重复10次。
三.利用递归计算20的阶乘
public class Temp {
public static void main(String[] args) {
System.out.println(method1(20));
}
//递归1
static long method1(int num) {
if(num==1) {
return 1;
}else {
return num*method1(num-1);
}
}
//递归2
static long method2(int num) {
if(num>=1) {
return (num)*method2(num-1);
}else {
return 1;
}
}
//递归3
static long method3(int num) {
if(num<=1) {
return 1;
}else {
return num*method3(num-1);
}
}
}
}
当实际单数20传入到方法中,将一次次逐层调用该方法(参数递减),但参数递减为1时,返回1,从最后一个方法先完成,逐层向上完成所有方法。
四.递归算法和循环算法的比较
递归算法和循环算法相比,需要占用更多的时间和内存资源
public class CompareRecursion {
public static void main(String[] args) {
long d1 = System.currentTimeMillis();
System.out.printf("递归算法结果为:%s\n",factorial(10));
long d2 = System.currentTimeMillis();
System.out.printf("递归算法时间为:%s%n",d2-d1); //21
factorialLoop(10); //0
}
//递归算法
public static long factorial(int n) {
if(n==1) {
return 1;
}else {
return n * factorial(n-1);
}
}
//循环算法
public static void factorialLoop(int m) {
long total = 1; //总数
long d3 = System.currentTimeMillis();
while(true) {
if(m==0) {
break;
}
total *= m;
m--;
}
long d4 = System.currentTimeMillis();
System.out.printf("循环算法的结果是:%s%n",total);
System.out.printf("循环算法的时间是%s",(d4-d3));
}
}