将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如:找出1到100之间的素数,需要将1到100之间的所有整数进行判断。
泊松是法国数学家、物理学家和力学家。 有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。 在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。 有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。 要求你只用3个容器操作,最后使得某个容器中正好有6升油。
规则如下:
1、大瓶子只能倒入中瓶子
2、中瓶子只能倒入小瓶子
3、小瓶子只能倒入大瓶子
4、小瓶子只有在已经装满的情况下才能倒入大瓶子
5、若小瓶子被倒空,则无论中瓶子是否满,应马上从中瓶子倒入小瓶子
代码如下:
package com.wuychn.recursion;
public class ShareWine {
private int b1 = 12; // 瓶子1的容量
private int b2 = 8;// 瓶子2的容量
private int b3 = 5;// 瓶子3的容量
private int m = 6;//目标酒量
//假设一开始12,0,0
private void backBottle(int bb1, int bb2, int bb3) {
System.out.println("bb1:" + bb1 + "~~bb2:" + bb2 + "~~bb3:" + bb3);
if (bb1 == m || bb2 == m || bb3 == m) {
System.out.println("find the bottle");
return;
}
if (bb2 != 0 && bb3 != b3) {
if (bb2 + bb3 <= b3) {
//倒不满
backBottle(bb1, 0, bb2 + bb3);
} else {
backBottle(bb1, bb2 - (b3 - bb3), b3);
}
} else if (bb3 == b3) {
//瓶子3满了,往瓶子1倒
if (bb3 + bb1 <= b1) {
//说明倒完后瓶子1没满
backBottle(bb1 + bb3, bb2, 0);
} else {
backBottle(b1, bb2, bb3 - (b1 - bb1));
}
} else if (bb2 == 0) {
//从瓶子1往瓶子2里倒酒
if (bb1 >= b2) {
backBottle(bb1 - b2, b2, bb3);
} else {
backBottle(0, bb1, bb3);
}
}
}
public static void main(String[] args) {
ShareWine shareWine = new ShareWine();
shareWine.backBottle(12, 0, 0);
}
}