使用ArrayLists的递归不会重复出现

时间:2013-01-25 14:52:07

标签: java recursion for-loop arraylist

当我遇到这个问题时,我正忙于问题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}的第一个实例后停止。我应该更改什么才能获得所需的结果?

提前致谢!

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

如果此澄清需要更多解释,请告诉我。