什么是递归?
递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。
几种经典的递归问题:
1.实现数的阶乘
public static int fact(int n) {
if (n <= 1)
return 1;
return n * fact(n - 1);
}
2.斐波那契数列
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
3,。最大公约数
public static int gcd(int m, int n) {
if (n == 0) {
return m;
}
return gcd(n, m % n);
}
4.汉诺塔问题
public static void printHanoTower(int n,String from,String to, String help){
if(n==1){
System.out.println("move "+n+" from "+from+" to " + to);
return;
}
printHanoTower(n-1,from,help,to);
System.out.println("move "+n+" from "+ from +" to "+to);
printHanoTower(n-1,help,to, from);
}
递归可视化-递归图形
为了更加方便理解递归,将递归用图形的方式进行展示
private void drawMyRect(int x, int y, int w, int h) {
if(w<10) {
return;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Random ran3 = new Random();
f1.drawRect(x, y, w, h);
int a=ran3.nextInt(2);
if(a==0) {
f1.setColor(Color.blue);
f1.fillRect(x+w/3, y+h/3, w/3, h/3);
}
else if(a==1) {
f1.setColor(Color.green);
f1.fillRect(x+w/3, y+h/3, w/3, h/3);
}
else if(a==2) {
f1.setColor(Color.orange);
f1.fillRect(x+w/3, y+h/3, w/3, h/3);
}
f1.setColor(Color.black);
drawMyRect(x, y, w/3, h/3);
drawMyRect(x+w/3, y, w/3, h/3);
drawMyRect(x+2*w/3, y, w/3, h/3);
drawMyRect(x,y+h/3,w/3,h/3);
drawMyRect(x+w/3,y+h/3,w/3,h/3);
drawMyRect(x+2*w/3,y+h/3,w/3,h/3);
drawMyRect(x,y+2*h/3,w/3,h/3);
drawMyRect(x+w/3,y+2*h/3,w/3,h/3);
drawMyRect(x+2*w/3,y+2*h/3,w/3,h/3);
}
效果实现