recursividad evitando

votos
0

Tengo un método, que me da el número requerido de cajas en función del número de dispositivos que puede hold.Currently he implementado esta lógica utilizando la recursividad

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

¿Hay algún método mejor para aplicar la misma lógica sin utilizar la recursividad. Debido a que este método es hacer mi solicitud muy lento para los casos cuando el número de dispositivos es superior a 50.000.

Publicado el 15/03/2010 a las 09:52
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
0

Sí, puede utilizar cola para evitar la recursividad. Smth como esto:

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

Pero parece que en su caso no es necesario recursividad / cola en absoluto. Ver otras respuestas.

Respondida el 15/03/2010 a las 09:56
fuente por usuario

votos
3

Qué tal esto:

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

return boxesRequired;

No veo por qué sería utilizar la recursividad o incluso una solución basada en cola para algo como esto.

Respondida el 15/03/2010 a las 09:59
fuente por usuario

votos
2

Creo que debe ser malentendido. Si es necesario determinar cuántas cajas sean necesarias para mantener un determinado número de dispositivos, es trivial:

boxesRequired = ceil(totalDevices / devicesPerBox)

... donde ceiles una operación que toma cualquier valor fraccional y se redondea al entero más cercano. (Casi todos los ambientes tienen esa operación sólo se dio cuenta de su etiqueta de .Net;. Es Math.Ceiling en .Net, si usted está usando JScript.Net también Math.ceilporque es una parte estándar de JavaScript.)

Si lo que necesita hacer es puramente con las matemáticas número entero:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Respondida el 15/03/2010 a las 09:59
fuente por usuario

votos
0

Es bastante probable que su compilador ya han transformado esta recursión de cola en un bucle.

Respondida el 15/03/2010 a las 10:05
fuente por usuario

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