Vermeiden Rekursion

stimmen
0

Ich habe eine Methode, die mir die erforderliche Anzahl von Boxen basierend auf der Anzahl von Geräten gibt es kann hold.Currently ich diese Logik implementiert unter Verwendung von Rekursion

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

Gibt es eine bessere Methode die gleiche Logik, ohne Rekursion zu implementieren. Da diese Methode macht meine Anwendung sehr langsam für die Fälle, wenn die Anzahl der Geräte 50000 überschreitet.

Veröffentlicht am 15/03/2010 um 09:52
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
0

Ja, können Sie Queue verwenden, um die Rekursion zu vermeiden. Smth wie folgt aus:

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

Aber es sieht aus wie Sie in Ihrem Fall nicht Rekursion / Warteschlange überhaupt benötigen. Andere Antworten.

Beantwortet am 15/03/2010 um 09:56
quelle vom benutzer

stimmen
3

Wie wäre es damit:

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

return boxesRequired;

Ich sehe nicht, warum Sie Rekursion oder sogar eine Warteschlange basierte Lösung für so etwas wie diese verwenden würden.

Beantwortet am 15/03/2010 um 09:59
quelle vom benutzer

stimmen
2

Ich glaube, ich muss Mißverständnis. Wenn Sie bestimmen müssen, wie viele Boxen nötig sind, um eine bestimmte Anzahl von Geräten zu halten, es ist trivial:

boxesRequired = ceil(totalDevices / devicesPerBox)

... wo ceilist eine Operation , die jeden Bruchwert übernimmt und auf die nächste ganze Zahl aufrundet. (Fast alle Umgebungen haben diese Operation bemerkte einfach Ihren .Net - Tag;. Es ist Math.Ceiling in .NET, wenn Sie mit JScript.Net ist es auch , Math.ceilweil das zu einem festen Bestandteil von JavaScript ist.)

Wenn Sie es rein mit ganzzahligen Mathematik zu tun:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Beantwortet am 15/03/2010 um 09:59
quelle vom benutzer

stimmen
0

Es ist sehr wahrscheinlich, dass Ihr Compiler bereits diese Endrekursion in eine Schleife verwandelt hat.

Beantwortet am 15/03/2010 um 10:05
quelle vom benutzer

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