1,什么是递归?
函数自己调用自己本身method(){
method();
}
或
methodA{
methodB();
}
methodB(){
methodA();
}
2,递归的作用
将一个复杂的问题分解成几个相同的简单问题
3,递归与循环的区别
递归需要出口
在进行循环时,每当一次循环结束,循环的结果作为下次循环的初始值,而上次循环占用的内存就会被系统释放。因此循环可以没有出口而不停无限循环下去。
而在进行递归时,程序是按层次进行下去的。每次函数执行到调用自身时,都会进行下一层,而上次的函数是没有执行完毕的。因此,每一轮得到的值都会存在内存中而不被释放。就像检索一个文件时,要先从最上层开始,一层一层向下检索,在未检索到目的文件之前,上层打开的文件夹一直都不会关闭。
因此,递归虽然相比于循环来说,递归算法的代码复杂度明显减小,但消耗的代价则是大量的内存。因此,当写一个递归程序时,必须添加出口,否则当内存被占满时就会报错。
4,使用递归的两个条件:
1),可以分解成几个情况相同的问题;2),必须有一个退出出口,否则就会因为内存被占用光而出现堆栈溢出
5,递归的两个部分:
1),递推 —— 函数调用自己的部分2),回归 —— 函数中递推之外的部分
6,例子:
1,1+2+....+n
//递归(累加1到n)
package Recursion;
public class Recursion {
public static int add(int i){
if(i == 0){
return 0;
}
else{
return add(i-1)+i;
}
}
public static void main(String[] args){
int sum = add(10);
System.out.println("sum = " + sum);
}
}
2,乘法表(循环)
package Recursion;
public class Multiplication {
public static int multiplication(int m){
for(int i = 1;i <= m;i++){
for(int j = 1;j <= i;j++){
System.out.print(j+"*"+i+"="+(i*j)+" ");
}
System.out.println();
}
return m;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
multiplication(9);
}
}
package Recursion;
public class Multi_Recursion {
public static void multiplication(int m){
if(m == 1){
System.out.println("1*1=0");
}
else{
multiplication(m - 1);
for(int i = 1;i <= m;i++){
System.out.print(i+"*"+m+"="+(i*m)+" ");
}
System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
multiplication(9);
}
}
4,斐波那契数列
package Recursion;
public class Fibonacci {
public static void fi(int i,int j){
if(j <= 200){
System.out.print(j+" ");
fi(j,i+j);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
fi(1,1);
}
}
public class HanoTower {
public static void move(int n,int t1,int t2,int t3){ //将n个盘子从t1移动到t3,t2辅助
if(n == 1){
System.out.println("将盘子从塔"+t1+"移动到塔"+t3);
}
else{
move(n-1,t1,t3,t2);
System.out.println("将盘子从塔"+t1+"移动到塔"+""+t3);
move(n-1,t2,t1,t3);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
move(3,1,2,3);
}
}