unngå rekursjon

stemmer
0

Jeg har en metode, som gir meg det nødvendige antall bokser basert på antall enheter det kan hold.Currently jeg har implementert denne logikken ved hjelp av rekursjon

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

Er det noen bedre metode for å implementere den samme logikken uten bruk av rekursjon. Fordi denne metoden er å gjøre min søknad svært treg for tilfeller der antall enheter overstiger 50 000.

Publisert på 15/03/2010 klokken 08:52
kilden bruker
På andre språk...                            


4 svar

stemmer
0

Ja, du kan bruke Kø for å unngå rekursjon. Smth som dette:

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

Men det ser ut som i ditt tilfelle trenger du ikke rekursjon / kø i det hele tatt. Se andre svar.

Svarte 15/03/2010 kl. 08:56
kilden bruker

stemmer
3

Hva med dette:

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

return boxesRequired;

Jeg ser ikke hvorfor du ville bruke rekursjon eller enda en kø basert løsning for noe sånt som dette.

Svarte 15/03/2010 kl. 08:59
kilden bruker

stemmer
2

Jeg tror jeg må være misforståelser. Hvis du trenger å finne ut hvor mange bokser er nødvendig for å holde et gitt antall enheter, er det trivielt:

boxesRequired = ceil(totalDevices / devicesPerBox)

... der ceiler en operasjon som tar noen brøkverdi og runder opp til nærmeste heltall. (Nesten alle miljøer har denne operasjonen Bare la merke til din Net tag,. Det er Math.Ceiling i .Net, hvis du bruker JScript.Net det er også Math.ceilfordi det er en standard del av Javascript.)

Hvis du trenger å gjøre det rent med heltall matematikk:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Svarte 15/03/2010 kl. 08:59
kilden bruker

stemmer
0

Det er ganske sannsynlig at kompilatoren har allerede forvandlet denne halen rekursjon i en loop.

Svarte 15/03/2010 kl. 09:05
kilden bruker

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