Vyhnout rekurze

hlasů
0

Mám metodu, která mi dává potřebný počet beden založených na počtu zařízení to může hold.Currently jsem implementoval tuto logiku pomocí rekurze

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;
        }

Existuje nějaký lepší způsob, jak realizovat stejnou logiku bez použití rekurze. Protože tato metoda dělá mé žádosti velmi pomalá pro případy, kdy počet zařízení převyšuje 50000.

Položena 15/03/2010 v 09:52
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
0

Ano, můžete použít frontu, aby se zabránilo rekurzi. Smth takto:

    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);
            }
        }
    }

Ale vypadá to, že ve vašem případě nemusíte rekurze / frontu vůbec. Viz další odpovědi.

Odpovězeno 15/03/2010 v 09:56
zdroj uživatelem

hlasů
3

A co tohle:

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

return boxesRequired;

Nevidím důvod, proč byste používat rekurzi nebo dokonce řešení založené fronty na něco takového.

Odpovězeno 15/03/2010 v 09:59
zdroj uživatelem

hlasů
2

Myslím, že musí být nedorozumění. Pokud potřebujete zjistit, kolik boxy jsou zapotřebí, aby daný počet zařízení, to je triviální:

boxesRequired = ceil(totalDevices / devicesPerBox)

... kde ceilje operace, která má žádnou desetinnou hodnotu a zaokrouhlí nahoru na nejbližší celé číslo. (Téměř všechna prostředích mít tuto operaci Just všimli NET značku;. Je to Math.Ceiling .NET, pokud používáte JScript.Net je to také Math.ceilproto, že to je standardní součástí JavaScriptu).

Pokud potřebujete, aby to čistě s integer matematiky:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Odpovězeno 15/03/2010 v 09:59
zdroj uživatelem

hlasů
0

Je docela pravděpodobné, že váš kompilátor již transformovány tento ocas rekurzi do smyčky.

Odpovězeno 15/03/2010 v 10:05
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more