斐波那契数列问题
package com.wzc;/*
*@date 2021/3/1
* @author wzc
*/
public class FebonacciTest {
public static void main(String[] args) {
//斐波那契数列:1 1 2 3 5 8 13以此类推,第三个数是前两个数字之和
int n = febonacci(5);
System.out.println(n);
}
public static int febonacci(int i){
if (i == 1||i == 2){
return 1;
}else {
return febonacci(i-1)+febonacci(i-2);
}
}
}
编译结果:
汉诺塔问题
规律: 1个圆盘的次数 2的1次方减1
2个圆盘的次数 2的2次方减1
3个圆盘的次数 2的3次方减1
因此类推
n个圆盘的次数 2的n次方减1
故:移动次数为:2^n - 1
实现这个算法可以简单分为三个步骤:
(1) 把n-1个盘子由A 移到 B;
(2) 把第n个盘子由A移到 C;
(3) 把n-1个盘子由B 移到 C;
因此:
(1)中间的一步是把最大的一个盘子由A移到C上去;
(2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
(3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;
图解流程:
package com.wzc;/*
*@date 2021/3/1
* @author wzc
*/
public class HanoiTest {
public static void main(String[] args) {
hanoi(3,'A','B','C');
}
/**
*
* @param n表示共有n个盘子
* @param from表示开始的柱子
* @param in表示中间的柱子
* @param to表示目标柱子
* 无论有多少盘子,都认为只有两个,上面的所有盘子和最下面一个盘子
*/
public static void hanoi(int n,char from,char in ,char to){
if (n==1){
System.out.println("第1个盘子从"+from+"移动到"+to);
}else {
//移动上面所有盘子到中间
hanoi(n-1,from,to,in);
//移动下面的盘子
System.out.println("第"+n+"个盘子从"+from+"移动到"+to);
//把上面盘子从中间位置移动到目标位置
hanoi(n-1,in,from,to);
}
}
}
编译结果: