Het vermijden van recursie

stemmen
0

Ik heb een methode, die me het vereiste aantal dozen gebaseerd op het aantal apparaten geeft het kan hold.Currently ik heb deze logica met behulp van recursie geïmplementeerd

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

Is er een betere manier om dezelfde logica uit te voeren zonder het gebruik van recursie. Omdat deze methode is het maken van mijn aanvraag erg langzaam voor gevallen waarin aantal apparaten hoger is dan 50.000.

De vraag is gesteld op 15/03/2010 om 09:52
bron van user
In andere talen...                            


4 antwoorden

stemmen
0

Ja, u kunt Queue gebruiken om de recursie te vermijden. Smth als volgt uit:

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

Maar het lijkt erop dat in uw geval u niet recursie / wachtrij bij nodig hebben. Zie andere antwoorden.

antwoordde op 15/03/2010 om 09:56
bron van user

stemmen
3

Wat denk je hiervan:

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

return boxesRequired;

Ik zie niet in waarom je recursie of zelfs een wachtrij gebaseerde oplossing zou gebruiken voor iets als dit.

antwoordde op 15/03/2010 om 09:59
bron van user

stemmen
2

Ik denk dat ik moet misverstand. Als u nodig hebt om te bepalen hoeveel dozen nodig zijn om een ​​bepaald aantal apparaten te houden, het is triviaal:

boxesRequired = ceil(totalDevices / devicesPerBox)

... waarbij ceileen bewerking die elke fractiewaarde draait en rondt het dichtstbijzijnde gehele getal. (Bijna alle omgevingen die operatie Net gemerkt dat uw .Net tag;. Het is Math.Ceiling in .Net, als u JScript.Net is het ook Math.ceil, want dat is een standaard onderdeel van JavaScript.)

Als u nodig hebt om het zuiver maken met integer wiskunde:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
antwoordde op 15/03/2010 om 09:59
bron van user

stemmen
0

Het is heel waarschijnlijk dat uw compiler al deze staartrecursie in een lus hebben veranderd.

antwoordde op 15/03/2010 om 10:05
bron van user

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