算法-02 递归和穷举

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);
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值