递归就是方法体内调用它自身,这大家都知道,没什么意思。
还是先看段代码(转自其它资料):
public classRecursionDemo {public static int multiply(intn) {if (n == 1 || n == 0)returnn;else
return n * multiply(n - 1);
}public static voidmain(String[] args) {
System.out.println(multiply(5));
}
}
大家都能看出这是个阶乘的例子,是一个5的阶乘。
multiply(5)---->5*multiply(4);
multiply(4)---->4*multiply(3);
multiply(3)---->3*multiply(2);
multiply(2)---->2*multiply(1);
当调到multiply(1)的时候返回是1,这时候依次返回:
multiply(2)---->1*2,multiply(3)---->1*2*3....multiply(5)---->1*2*3*4*5
最后返回的是120。
从这个例子可以看出递归调用其自身,一层一层往下调用,直到有返回值,再一层一层返回。
不过要想深入了解递归,还得从栈的角度去看方法的调用
再看一段代码:
public voida(){}public voidb(){
System.out.println("Hello");
a();
System.out.println("boy");
}
方法b()调用了方法a(),这个时候程序不再是顺序执行,而是发生了跳转。CPU首先将下一条机器指令的地址以及相关参数信息压入栈中,然后程序跳转到a()的方法体中。当a()方法返回时,CPU会及时出栈操作,取出上一次存储的机器指令的地址以及参数信息,即System.out.println("boy")(System.out.println()不是一条机器指令,而是被翻译成多条机器指令)
递归方法也是一个道理,只不过,调用者与被调用者是同一个方法而已。
递归与循环有些相似,但又截然不同。循环没有方法间的调用关系,也就是没有指令地址的压栈、出栈,它仅仅是指令地址的改变。