1 递归 汉诺塔 挪盘子
有n个盘子在第一个柱子上,每次移动一个盘子,每个盘子必须在比自己大的盘子上面三个柱子
recusive.hanoiMethod(2, "A", "B", "C");
private void hanoiMethod(int size,String from,String dependon,String to){
if(size==1){
move(from, to);
}else{
//要把siz个盘子从A依靠B移到C,那么
//第一步就要把size-1个盘子从A依靠C移动到B
hanoiMethod(size-1, from, to, dependon);
//第二步 把A最下面的盘子移动到C
move(from,to);
//第三步 把size-个盘子从B依靠A移动到C
hanoiMethod(size-1, dependon, from, to);
}
}
int i=1;
private void move(String from,String to){
System.out.println("第"+i+++"步从"+from+"移动到"+to);
}
2 递归 欧几里得算法 求最大公约数
/**
* 利用性质m和n的最大公约数=m%n和n的最大公约数
*求两个数的最大公约数
*/
private int getGreatestCommonDivisor(int num1,int num2){
//当余数为0 说明num1为最大公约数
if(num2==0){
return num1;
}else{
//如果num1>num2,那么 num1%num2<num2.
//如果num1<num2,那么num1%num2<num2.
//所以此方法的num1>num2
return getGreatestCommonDivisor(num2,num1%num2);
}
}
3 穷举 泊松分酒
有三个瓶子 12升 8升 5 升 要倒出6升的美酒
为了防止瞎倒,如循环或者倒入后不知道杯子内的容量。所以提前规定:
- 1 从杯子1倒入杯子2,且杯子2是空的。
- 2 从杯子2倒入杯子3,且杯子2不是空的,杯子3不是满的。
- 3 从杯子3倒入杯子1,且杯子3是满的。
/**
* @param cup1Left
* @param cup2Left
* @param cup3Left
*/
int cup1Size = 12;
int cup2Size = 8;
int cup3Size = 5;
public void pourIntoCup(int cup1Left,int cup2Left,int cup3Left){
System.out.println("1剩余"+cup1Left+" 2剩余"+cup2Left+" 剩余"+cup3Left);
if(cup1Left==6||cup2Left==6||cup3Left==6){
System.out.println("Has get 6L");
return;
}
//从杯子1倒入杯子2 1)没把2倒满 2)把2倒满了
if(cup2Left==0){
if(cup1Left<cup2Size){
pourIntoCup(0, cup1Left, cup3Left);
}else{
pourIntoCup(cup1Left-cup2Size, cup2Size, cup3Left);
}
//从杯子2倒入杯子3 1)没把3倒满 2)把三倒满了
}else if(cup2Left!=0&&cup3Left!=cup3Size){
if(cup2Left+cup3Left<cup3Size){
pourIntoCup(cup1Left, 0, cup3Left+cup2Left);
}else{
pourIntoCup(cup1Left, cup2Left-(cup3Size-cup3Left), cup3Size);
}
//从杯子3倒入杯子1 1)没把杯子1倒满 2)把杯子1倒满了
}else if(cup3Left==cup3Size){
if(cup1Left+cup3Size<cup1Size){
pourIntoCup(cup1Left+cup3Size, cup2Left, 0);
}
}
}