-4

私はこのコードを持っています:

int LRLength = LR.Count;
            for (int i = 0; i < LR.Count; i++)
            {
                LRLength = LR.Count;
                LR = merge(LR);
                if (LR.Count < LRLength)
                {
                    LR = merge(LR);
                    if (LR.Count == LRLength)
                    {
                        break;
                    }
                }
            }

そしてこれは関数のマージです:

private List<Lightnings_Extractor.Lightnings_Region> merge(List<Lightnings_Extractor.Lightnings_Region> Merged)
        {
            List<Lightnings_Extractor.Lightnings_Region> NewMerged = new List<Lightnings_Extractor.Lightnings_Region>();
            Lightnings_Extractor.Lightnings_Region reg;
            int dealtWith = -1;
            for (int i = 0; i < Merged.Count; i++)
            {
                if (i != dealtWith)
                {

                    reg = new Lightnings_Extractor.Lightnings_Region();

                    if (i < Merged.Count - 1)
                    {

                        if (Merged[i].end + 1 >= Merged[i + 1].start)
                        {
                            reg.start = Merged[i].start;
                            reg.end = Merged[i + 1].end;
                            NewMerged.Add(reg);
                            dealtWith = i + 1;
                        }
                        else
                        {
                            reg.start = Merged[i].start;
                            reg.end = Merged[i].end;
                            NewMerged.Add(reg);
                        }
                    }
                    else
                    {

                        reg.start = Merged[i].start;
                        reg.end = Merged[i].end;
                        NewMerged.Add(reg);

                    }
                }
            }
            return NewMerged;
        }

このクラスでは:Lightnings_Extractor.Lightnings_Region2つのint変数しかありません。この関数のアイデアは、リストを取得し、合同な領域をマージすることです。

たとえば、関数を呼び出して、リストLRの長さが8になったら、元に戻す回数を減らします。たとえば、2つのインデックスを1つにマージする必要がある場合、代わりに取得するリストの長さは7になります。別のインデックスをマージする必要がある場合、長さは6になります。

上記の最初のコードで確認したいのは、インデックスをマージするための関数の呼び出しをいつ停止する必要があるかです。

長さが8で、次回も8の場合は、ループを停止することはできません。長さが8で、次に7の場合は、関数を再度呼び出します。長さが7の場合、ループを停止します。ただし、長さが6の場合は、もう一度呼び出し続けます。

最後の長さが前の長さと同じになるまで!!!

だから私はこのコードを試しましたが、うまくいきません:

int LRLength = LR.Count;
                for (int i = 0; i < LR.Count; i++)
                {
                    LRLength = LR.Count;
                    LR = merge(LR);
                    if (LR.Count < LRLength)
                    {
                        LR = merge(LR);
                        if (LR.Count == LRLength)
                        {
                            break;
                        }
                    }
                }
4

1 に答える 1

2

あなたが達成しようとしていることに関していくつかの仮定をしようとしています。以下は基本的に、比較のためにリストの元の長さをキャプチャします。少なくとも1回は実行され、LRLength==LR.Countまで実行され続けます。

int LRLength = LR.Count;
do{ 
    LR = merge(LR); 
} while(LR.Count != LRLength);

同じカウントが2回続けて得られるまでループを実行しようとした場合:

int prevCount;
do{
    prevCount = LR.Count;
    LR = merge(LR); 
} while(prevCount != LR.Count);
于 2013-02-09T20:51:06.730 に答える