Evitare la ricorsione

voti
0

Ho un metodo, che mi dà il numero di caselle in base al numero di dispositivi che può hold.Currently ho implementato questa logica utilizzando la ricorsione

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

Esiste un metodo migliore per implementare la stessa logica senza usare la ricorsione. Poiché questo metodo sta facendo mia domanda molto lenta per i casi in cui il numero di dispositivi superiore a 50000.

È pubblicato 15/03/2010 alle 09:52
fonte dall'utente
In altre lingue...                            


4 risposte

voti
0

Sì, è possibile utilizzare coda per evitare la ricorsione. Smth come questo:

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

Ma sembra che nel tuo caso non è necessario ricorsione / coda a tutti. Vedi altre risposte.

Risposto il 15/03/2010 a 09:56
fonte dall'utente

voti
3

Cosa ne pensi di questo:

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

return boxesRequired;

Non vedo il motivo per cui si usa la ricorsione o addirittura una soluzione basata coda per qualcosa di simile.

Risposto il 15/03/2010 a 09:59
fonte dall'utente

voti
2

Penso che devo essere equivoco. Se è necessario per determinare quante scatole necessario a contenere un certo numero di dispositivi, è banale:

boxesRequired = ceil(totalDevices / devicesPerBox)

... dove ceilè un'operazione che richiede alcun valore frazionario e arrotonda al numero intero più vicino. (Quasi tutti gli ambienti hanno che l'operazione appena notato il tag Net,. È Math.Ceiling in .Net, se si sta utilizzando JScript.Net è anche Math.ceilperché questa è una parte standard di JavaScript).

Se avete bisogno di farlo esclusivamente con la matematica intero:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Risposto il 15/03/2010 a 09:59
fonte dall'utente

voti
0

E 'molto probabile che il compilatore ha già trasformato questo ricorsione di coda in un ciclo.

Risposto il 15/03/2010 a 10:05
fonte dall'utente

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