1

我有一个方法,它接收一个数字n作为参数并计算所有可能的组合,正好包含n 1在一个 bit(0,1) 数组中,返回的结果是数字 1 的位置

例如假设我们的位数组有3元素和

 for n = 1
   the function gives : [0] - [1] - [2] (three possible positions)
 for n=2
   the result will be [0,1] -  [0,2] - [1,2] (three possible positions)

对于 n=3,结果将是 [0,1,2] (一个可能的位置)

该函数对具有 3 个元素的数组正常工作,但对 4 个元素给出错误的结果

  n = 2 result : [0,1] - [0,2] - [0,3] -[1,2] - [1,3] - [1,2,3]

任何人都可以解释为什么它会为 arraysize >= 4 给出意想不到的结果

提前致谢

    const int arraySize = 4;

    static private void Positions(int n, int start, ArrayList prepend, ArrayList results)
    {
        ArrayList tmp = new ArrayList(prepend);
        int end = arraySize - n;
        for (int i = start; i <= end; i++)
        {
            if (end < arraySize - 1)
            {
                prepend.Add(i);
                Positions(n - 1, i + 1, prepend, results);                    
                prepend = tmp;
            }
            else
                results.Add(new ArrayList(prepend) { i });
        }
    }

这就是我使用该方法的方式

    static void Main(string[] args)
    {
        ArrayList results = new ArrayList();            
        Positions(2, 0, new ArrayList(), results);

        foreach (ArrayList array in results)
        {
            foreach (var elem in array)
                Console.Write(elem);
            Console.WriteLine();
        }

        Console.Read();
    }
4

1 回答 1

1

我认为问题出在这一行:

prepend = tmp;

您打算我认为在方法开始时将 prepend 数组的状态恢复为原始状态。但是,您正在设置直接引用,因此在每次循环迭代时,您都在修改原始的前置数组。如果您每次都在这里复制数组,它似乎可以正常工作:

prepend = new ArrayList(tmp);

然而,所有这些数组的复制都不是很有效。您可以尝试删除刚刚添加的条目以及另一种选择:

prepend.Add(i);
Positions(n - 1, i + 1, prepend);
prepend.Remove(i);

然后从技术上讲,您甚至不再需要tmp副本。

编辑:另外,对于你的if陈述,我认为你想要类似的东西

if (n > 1)
于 2012-06-01T22:49:59.403 回答