0

保持できるデバイスの数に基づいて必要なボックスの数を提供するメソッドがあります。現在、再帰を使用してこのロジックを実装しています

private uint PerformRecursiveDivision(uint m_oTotalDevices,uint m_oDevicesPerBox, ref uint BoxesRequired)
        {
            if (m_oTotalDevices< m_oDevicesPerBox)
            {
                BoxesRequired = 1;
            }
            else if ((m_oTotalDevices- m_oDevicesPerBox>= 0) && (m_oTotalDevices- m_oDevicesPerBox) < m_oDevicesPerBox)
            {
                //Terminating condition
                BoxesRequired++;
                return BoxesRequired;
            }
            else
            {
                //Call recursive function
                BoxesRequired++;
                return PerformRecursiveDivision((m_oTotalDevices- m_oDevicesPerBox), m_oDevicesPerBox, ref BoxesRequired);
            }
            return BoxesRequired;
        }

再帰を使用せずに同じロジックを実装するためのより良い方法はありますか? この方法では、デバイスの数が 50000 を超える場合にアプリケーションが非常に遅くなるためです。

4

4 に答える 4

3

これはどう:

int boxesRequired = m_oTotalDevices / m_oDevicesPerBox;
if (m_oTotalDevices % m_oDevicesPerBox > 0)
    boxesRequired++;

return boxesRequired;

このようなものに再帰やキューベースのソリューションを使用する理由がわかりません。

于 2010-03-15T08:59:15.430 に答える
2

私は誤解しているに違いないと思います。特定の数のデバイスを保持するために必要なボックスの数を決定する必要がある場合は、簡単です。

boxesRequired = ceil(totalDevices / devicesPerBox)

...ここceilで、小数値を取り、最も近い整数に切り上げる操作です。(ほぼすべての環境にその操作があります。ちょうど .Net タグに気付きました。それは .Net のMath.Ceiling です。JScript.Netを使用している場合は、それMath.ceilが JavaScript の標準部分であるためでもあります。)

純粋に整数演算で行う必要がある場合:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
于 2010-03-15T08:59:27.420 に答える
0

はい、Queue を使用して再帰を回避できます。次のようにします。

    private void ProcessNonRecursively(string data)
    {
        Queue<string> queue = new Queue<string>();

        // Enque initiali data.
        queue.Enqueue(data);

        while (queue.Count > 0)
        {
            // Get current data.
            string currentData = queue.Dequeue();

            // Process it here...

            // Enque all data to be processed instead of calling the recursion.
            foreach (string newData in someNewDataAfterProcessing)
            {
                queue.Enqueue(newData);
            }
        }
    }

しかし、あなたの場合、再帰/キューはまったく必要ないようです。他の回答を参照してください。

于 2010-03-15T08:56:50.790 に答える
0

コンパイラがこの末尾再帰を既にループに変換している可能性が非常に高いです。

于 2010-03-15T09:05:35.987 に答える