本文主要是介绍算法-02 递归和穷举,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1 递归 汉诺塔 挪盘子
- 2 递归 欧几里得算法 求最大公约数
- 3 穷举 泊松分酒
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移动到BhanoiMethod(size-1, from, to, dependon);//第二步 把A最下面的盘子移动到Cmove(from,to);//第三步 把size-个盘子从B依靠A移动到ChanoiMethod(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>num2return 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);}}}
这篇关于算法-02 递归和穷举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!