récursion Éviter

voix
0

J'ai une méthode, ce qui me donne le nombre de boîtes en fonction du nombre d'appareils peut hold.Currently i ont mis en œuvre cette logique en utilisant récursion

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

Y at-il une meilleure méthode pour mettre en œuvre la même logique sans utiliser récursivité. Parce que cette méthode fait ma demande très lent pour les cas lorsque le nombre d'appareils est supérieur à 50 000.

Créé 15/03/2010 à 09:52
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
0

Oui, vous pouvez utiliser la file d'attente pour éviter la récursion. Smth comme ceci:

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

Mais il semble que dans votre cas, vous n'avez pas besoin récursion / file d'attente du tout. Voir d'autres réponses.

Créé 15/03/2010 à 09:56
source utilisateur

voix
3

Que dis-tu de ça:

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

return boxesRequired;

Je ne vois pas pourquoi vous utiliseriez solution récursion ou même une file d'attente pour quelque chose comme ça.

Créé 15/03/2010 à 09:59
source utilisateur

voix
2

Je pense que je dois être mal compris. Si vous devez déterminer le nombre de boîtes nécessaires pour tenir un certain nombre de dispositifs, il est trivial:

boxesRequired = ceil(totalDevices / devicesPerBox)

... où ceilest une opération qui prend une valeur fractionnelle et arrondit au nombre entier le plus proche. (Presque tous les environnements ont remarqué cette opération juste votre tag .Net,. Il est Math.Ceiling en .Net, si vous utilisez JScript.Net c'est aussi Math.ceilparce que c'est une partie standard de JavaScript.)

Si vous avez besoin de le faire uniquement avec les mathématiques entier:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Créé 15/03/2010 à 09:59
source utilisateur

voix
0

Il est fort probable que votre compilateur a déjà transformé cette récursion queue dans une boucle.

Créé 15/03/2010 à 10:05
source utilisateur

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