递归的(个人)超详细讲解
程序员文章站
2022-05-08 22:18:33
...
递归
理解递归:
1.调用自己本身
2.有一个趋近与终止的条件
图解看20201014
个人注意事项:
不要尝试展开代码
思考递归:横向思考
代码执行:纵向执行
把大事化小事,但是大事和小事处理的方式是一样的
栈里面放数据,先进后出
示例
//按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) 递归求解
public class TestDemo01 {
public static void main(String[] args) {
int a=1234;
print(a);
}
public static void print(int n){
if (n<=9){
System.out.print(n);
return;
}
print(n/10);
System.out.print(n%10);
}
}
//青蛙跳台阶问题
// 一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
public class TestDemo07 {
public static void main(String[] args) {
int n =4;
System.out.println(norSum(n));
// System.out.println(addSumN(n));
}
// public static int addSum(int n){
// if (n==1){
// return 1;
// }
// if (n==2){
// return 2;
// }
// return addSum(n-1)+addSum(n-2);//类似斐波那契
// }
// public static int addSumN(int n){//可以跳n级(变态跳)
// if (n==1){
// return 1;
// }
// return 2*addSumN(n-1);
// }
public static int norSum(int n){//非递归
if(n==1||n==2){
return n;
}
int f1=1;
int f2=2;
int f3=0;
for (int i = 3; i <=n; i++) {
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
}
//递归求解汉诺塔问题
public class TestDemo08 {
public static void main(String[] args) {
hanoiTower(3,'A','B','C');
}
public static void move(char x,char y){
System.out.print(x+"->"+y+"\t");
}
/**
*
* @param n 盘子的数量
* @param a 盘子的现在位置
* @param b 中转的位置
* @param c 终点位置
*/
public static void hanoiTower(int n, char a,char b,char c){
if (n == 1) {
move(a,c);
return;
}
hanoiTower(n-1,a,c,b);
move(a,c);
hanoiTower(n-1,b,a,c);
}
}