Как избежать рекурсии

голоса
0

У меня есть метод, который дает мне необходимое количество ящиков на основе количества устройств может hold.Currently я реализовал эту логику с помощью рекурсии

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

Есть ли лучший способ реализовать ту же логику без использования рекурсии. Поскольку этот метод делает мое приложение очень медленно, за исключением случаев, когда количество устройств превышает 50000.

Задан 15/03/2010 в 09:52
источник пользователем
На других языках...                            


4 ответов

голоса
0

Да, вы можете использовать очереди, чтобы избежать рекурсии. Smth как это:

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

Но, похоже, в вашем случае вам не нужна рекурсия / очередь на всех. Смотрите другие ответы.

Ответил 15/03/2010 в 09:56
источник пользователем

голоса
3

Как насчет этого:

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

return boxesRequired;

Я не понимаю, почему вы должны использовать рекурсию или даже решение, основанное очереди что-то вроде этого.

Ответил 15/03/2010 в 09:59
источник пользователем

голоса
2

Я думаю, что я должен быть недоразумение. Если вам нужно определить, сколько ящиков необходимо провести определенное количество устройств, это тривиально:

boxesRequired = ceil(totalDevices / devicesPerBox)

... где ceilэто операция , которая принимает любое дробное значение и округление до ближайшего целого числа. (Почти все среды имеют эту операцию Просто заметил ваш .Net тег;. Это Math.Ceiling в .NET, если вы используете JScript.Net это также Math.ceilпотому , что это стандартная часть JavaScript.)

Если вам нужно сделать, это чисто с целочисленной математики:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif
Ответил 15/03/2010 в 09:59
источник пользователем

голоса
0

Вполне вероятно, что ваш компилятор уже превратили этот хвост рекурсии в петлю.

Ответил 15/03/2010 в 10:05
источник пользователем

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