Evitarea recursivitate

voturi
0

Am o metodă, care îmi dă numărul de cutii bazate pe numărul de dispozitive poate hold.Currently i-au pus în aplicare această logică folosind recursivitate

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

Există vreo metodă mai bună de a pune în aplicare aceeași logică, fără a utiliza recursivitate. Deoarece această metodă este de a face cererea mea foarte lent pentru cazurile în care numărul de dispozitive depășește 50000.

Întrebat 15/03/2010 la 09:52
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
0

Da, puteți utiliza Coadă pentru a evita recursivitatea. Smth ca aceasta:

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

Dar se pare că în cazul dumneavoastră nu aveți nevoie de recurență / coadă la toate. A se vedea alte răspunsuri.

Publicat 15/03/2010 la 09:56
sursa de către utilizator

voturi
3

Ce zici de asta:

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

return boxesRequired;

Nu văd de ce ar folosi de recurență sau chiar și o soluție bazată pe coadă pentru așa ceva.

Publicat 15/03/2010 la 09:59
sursa de către utilizator

voturi
2

Cred că trebuie să fie neînțelegere. Dacă aveți nevoie pentru a determina cât de multe cutii sunt necesare pentru a organiza un anumit număr de dispozitive, este banal:

boxesRequired = ceil(totalDevices / devicesPerBox)

... în cazul în care ceileste o operație care ia orice valoare fracționată și rotunjește până la cel mai apropiat întreg. (Aproape toate mediile au această operație doar a observat eticheta .Net,. Este Math.Ceiling în .Net, dacă utilizați JScript.Net este , de asemenea , Math.ceilpentru că este o parte standard a JavaScript.)

Dacă trebuie să o faci pur și simplu cu matematica întreg:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Publicat 15/03/2010 la 09:59
sursa de către utilizator

voturi
0

Este destul de probabil ca dvs. compilator au transformat deja acest recursivitate coada într-o buclă.

Publicat 15/03/2010 la 10:05
sursa de către utilizator

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