kaçınmak tekrarlama

oy
0

Ben hold.Currently i özyineleme kullanarak bu mantık uygulamış olabilir bana cihazların sayısına dayalı Kutuları gerekli sayıda veren bir yöntem var

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

Özyinelemeyi kullanmadan aynı mantık uygulamak için daha iyi bir yöntem var mı. Bu yöntem cihazlarının sayısı 50000 aştığında durumlar için başvurum çok yavaş yapıyor çünkü.

Oluştur 15/03/2010 saat 09:52
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
0

Evet, Özyinelemeyi önlemek için Sıra'yı kullanabilirsiniz. Böyle sola sallamak:

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

Ama bu durumda size hiç tekrarlama / kuyruğunu ihtiyacın yokmuş gibi görünüyor. Diğer yanıtları inceleyin.

Cevap 15/03/2010 saat 09:56
kaynak kullanıcı

oy
3

Buna ne dersin:

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

return boxesRequired;

Eğer böyle bir şey için özyineleme hatta kuyruk tabanlı bir çözüm kullanmak istiyorsunuz neden görmüyorum.

Cevap 15/03/2010 saat 09:59
kaynak kullanıcı

oy
2

Ben yanlış anlama olmalı düşünüyorum. Eğer cihazların belirli bir sayıda tutmak için gerekli olan kaç kutu belirlemek gerekiyorsa, o Önemsiz:

boxesRequired = ceil(totalDevices / devicesPerBox)

... nerede ceilherhangi fraksiyonel değerini alır ve en yakın tam sayıya yuvarlar bir operasyondur. (; Bu kadar. Neredeyse tüm ortamlar Sadece Net etiketi fark operasyon Math.Ceiling Net; kullandığınız takdirde JScript.Net o da var Math.ceilolduğunu JavaScript standart bir parçası olduğu için.)

Eğer tamsayı matematik ile tamamen yapmak gerekirse:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Cevap 15/03/2010 saat 09:59
kaynak kullanıcı

oy
0

Sizin derleyici zaten bir döngü içine bu kuyruk Özyinelemeyi dönüştürülmüş olması oldukça muhtemeldir.

Cevap 15/03/2010 saat 10:05
kaynak kullanıcı

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