递归的内容剖析
1.递归其实就是传入不同参数,调用同一方法.多层之间相互嵌套,相互传递,直到参数达到某种边界.
2.要想用递归要理解每个递归的逻辑,也就是每个递归的公式.(这是难点)
递归的经典示例
1.斐波那契数列
斐波那契数列的排列是:0,1,1,2,3,5,8,13,21,34,55,89,144……依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。
递归逻辑:一个数等于前两个数之和.
package demo;
public class Sum {
public static void main(String[] args) {
int i = 1; for (i = 1; i <= 20; i++) {
System.out.println("前" + i + "个数的和为:" + f(i));
}
}
public static int f(int x) {
if (x == 1 || x == 2) {
return 1;
} else {
return f(x - 1) + f(x - 2);
}
}
}
2.汉诺塔
要求: 有三根杆子X,Y,Z。X杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至Y杆:
(1)每次只能移动一个圆盘;
(2)大盘不能叠在小盘上面。
递归逻辑:
当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。(除了只有一个盘子时不需要借助其他塔外,其余情况均一样)
public class Demo {
public static void move(int n, char from, char inter, char to) {
if (n == 1) {
System.out.println("从" + from + " 移动" + n+ " 号到" + to);
} else {
move(n - 1, from, to, inter);
System.out.println("从" + from + " 移动" + n+ " 号到" + to);
move(n - 1, inter, from, to);
}
}
public static void main(String[] args) {
int num = 3;
move(num, 'A', 'B', 'C');
}
}