unikanie rekurencji

głosy
0

Mam metodę, która daje mi odpowiednią ilość opakowań na podstawie liczby urządzeń może hold.Currently I wprowadziły tę logikę za pomocą rekurencji

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

Czy istnieje lepszy sposób, aby realizować tę samą logikę bez użycia rekursji. Ponieważ metoda ta robi mój wniosek bardzo powolne w przypadkach, gdy liczba urządzeń przekracza 50000.

Utwórz 15/03/2010 o 09:52
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
0

Tak, można użyć kolejki unikać rekursji. Czymś tak:

    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 to wygląda w Twoim przypadku nie trzeba rekurencji / kolejki w ogóle. Zobacz inne odpowiedzi.

Odpowiedział 15/03/2010 o 09:56
źródło użytkownik

głosy
3

Co powiesz na to:

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

return boxesRequired;

Nie widzę, dlaczego byłoby użyć rekurencji lub nawet rozwiązanie oparte kolejki na coś takiego.

Odpowiedział 15/03/2010 o 09:59
źródło użytkownik

głosy
2

Myślę, że musi być nieporozumienie. Jeśli trzeba określić, ile pól są potrzebne, aby utrzymać daną liczbę urządzeń, to jest trywialne:

boxesRequired = ceil(totalDevices / devicesPerBox)

... gdzie ceilto operacja, która wykonuje jakąkolwiek wartość ułamkową i zaokrągla w górę do najbliższej liczby całkowitej. (Prawie wszystkie środowiska mają tę operację Właśnie zauważyłem tag .Net;. To Math.Ceiling w .NET, jeśli używasz JScript.Net to również Math.ceildlatego, że jest standardową częścią JavaScript.)

Jeśli trzeba to zrobić wyłącznie z całkowitą matematyki:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Odpowiedział 15/03/2010 o 09:59
źródło użytkownik

głosy
0

Jest całkiem prawdopodobne, że kompilator już przekształcone ten ogon rekursji w pętlę.

Odpowiedział 15/03/2010 o 10:05
źródło użytkownik

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