求解汉诺塔问题:
问题:
从左到右有 x、y、z 三根柱子,其中 x 柱子上面有从小叠到大的 n 个圆盘。现要求将 x 柱子上的圆盘移到 z 柱子上去。要求是,每次只能移动一个盘子,且大盘子不能被放在小盘子上面
解析:
- 把从小到大的 n-1 个盘子,从 x 移动到 y;
- 接着把最大的一个盘子,从 x 移动到 z;
- 再把从小到大的 n-1 个盘子,从 y 移动到 z。
public static void main(String[] args) {
String x = "x";
String y = "y";
String z = "z";
hanio(3, x, y, z);
}
public static void hanio(int n, String x, String y, String z) {
if (n < 1) {
System.out.println("汉诺塔的层数不能小于1");
} else if (n == 1) {
System.out.println("移动: " + x + " -> " + z);
return;
} else {
hanio(n - 1, x, z, y);
System.out.println("移动: " + x + " -> " + z);
hanio(n - 1, y, x, z);
}
}
输出:
移动: x -> z
移动: x -> y
移动: z -> y
移动: x -> z
移动: y -> x
移动: y -> z
移动: x -> z
过程分析:
我们以 n = 3 为例,执行一下这段代码:
- 在主函数中,执行了 hanio(3, “x”, “y”, “z”)。我们发现 3 比 1 要大,则进入递归体。分别先后执行了 hanio(2, “x”, “z”, “y”)、“移动: x->z”、hanio(2, “y”, “x”, “z”)。
- 其中的 hanio(2, “x”, “z”, “y”),又先后执行了 hanio(1, “x”, “y”, “z”)、“移动: x->y”、hanio(1, “z”, “x”, “y”)。在这里,hanio(1, “x”, “y”, “z”) 的执行结果是 “移动: x->z”,hanio(1, “z”, “x”, “y”)的执行结果是"移动: z->y"。
- 另一边,hanio(2, “y”, “x”, “z”) 则要先后执行 hanio(1, “y”, “z”, “x”)、“移动: y->z”、hanio(1, “x”, “y”, “z”)。在这里,hanio(1, “y”, “z”, “x”) 的执行结果是"移动: y->x",hanio(1, “x”, “y”, “z”) 的执行结果是 “移动: x->z”。
求解斐波那契数列:
斐波那契数列是:0,1,1,2,3,5,8,13,21,34,55,89,144……。
某个数等于它前面两个数的和;也就是 a[n+2] = a[n+1] + a[n]。至于起始两个元素,则分别为 0 和 1。
写一个函数,输入 x,输出斐波那契数列中第 x 位的元素。例如,输入 4,输出 2;输入 9,输出 21
public static void main(String[] args) {
System.out.println(hanio(9));
}
public static int hanio(int n) {
if(n==1){
return 0;
}else if(n==2){
return 1;
}else{
int a =hanio(n-2)+hanio(n-1);
return a;
}
}
输出 :21