当我遇到这个问题时,我正忙于问题151来自projecteuler,http://projecteuler.net/problem=151。
我正在尝试使用ArrayList envelope
(仅包含2的幂)和int index
作为参数进行简单的递归。它首先替换信封位置index
处的整数,其下方的所有幂都为2(例如16变为8,4,2,1)。然后它将索引从0循环到新envelope
的末尾,并使用新包络和新索引作为参数应用相同的递归,直到包络等于{1}。假设我正在计算可以实现的方法数量。这是代码:
import java.util.ArrayList;
public class Prob151 {
public static void main(String[] args) {
totalCount = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(8);
recursion(list,0,1);
System.out.printf("%d",totalCount);
}
public static int totalCount;
public static void recursion(ArrayList<Integer> envelope, int index, int batch) {
int number = envelope.get(index);
if (envelope.size() == 1 && number == 1) {
totalCount += 1;
} else {
// Updates the envelope
envelope.remove(index);
while (number > 1) {
number /= 2;
envelope.add(number);
}
batch += 1;
for (int i = 0; i < envelope.size(); i++) {
// Displays current information
System.out.printf("batch = %d, envelope = {",batch);
for (int j : envelope) {
System.out.printf("%d,",j);
}
System.out.printf("}, i = %d\n",i);
recursion(envelope,i,batch);
}
}
}
}
这是我得到的输出:
batch = 2, envelope = {4,2,1,}, i = 0
batch = 3, envelope = {2,1,2,1,}, i = 0
batch = 4, envelope = {1,2,1,1,}, i = 0
batch = 5, envelope = {2,1,1,}, i = 0
batch = 6, envelope = {1,1,1,}, i = 0
batch = 7, envelope = {1,1,}, i = 0
batch = 8, envelope = {1,}, i = 0
1
它不会返回到索引i = 1的批处理7,而是在遇到envelope = {1}的第一个实例后停止。我应该更改什么才能获得所需的结果?
提前致谢!
答案 0 :(得分:0)
在这里可以帮到你的一些事情:
1)您使用的是错误的数据结构,问题清楚地表明他随机抓取了一个信封。我强烈建议使用Bag
。
2)运行第一批后,您的信封包含以下元素:
1 A2
1 A3
1 A4
1 A5
因此,在第一次传球中选择A5的几率为1 in 4
,因此如果在第一次选择中找不到A5
并且我们得到A2
,则您的信封如下所示:
2 A3
2 A4
2 A5
现在第三批有2 in 6
(1/3)机会选择A5
。
如果此澄清需要更多解释,请告诉我。