1

パラメータとして数値を受け取り、ビット(0,1)配列に n正確に含まれるすべての可能な組み合わせを計算するメソッドがあり、返される結果は数値1の位置ですn 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] (1 つの可能な位置) になります。

関数は 3 つの要素を持つ配列に対しては正しく機能しますが、4 つの要素に対しては間違った結果を返します

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

配列サイズ>= 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 = 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 に答える