避免递归

时间:2010-03-15 08:52:07

标签: .net recursion pseudocode

我有一个方法,它根据它可以容纳的设备数量给出了所需数量的Box。目前我已经使用递归实现了这个逻辑

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

4 个答案:

答案 0 :(得分:3)

这个怎么样:

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

return boxesRequired;

我不明白为什么你会使用递归甚至基于队列的解决方案来做这样的事情。

答案 1 :(得分:2)

我想我一定是误会。如果您需要确定需要多少个盒子来容纳给定数量的设备,这很简单:

boxesRequired = ceil(totalDevices / devicesPerBox)

...其中ceil是一个采用任何小数值并向上舍入到最接近整数的运算。 (几乎所有的环境都有这种操作。只是注意到你的.Net标签;它是。Math.Ceiling在.Net;如果你使用JScript.Net它也是Math.ceil因为那是JavaScript的标准部分。)< / p>

如果你需要纯粹用整数数学来做:

boxesRequired = totalDevices / devicesPerBox
if totalDevices mod devicesPerBox <> 0 then
    increment boxesRequired
endif

答案 2 :(得分:0)

是的,您可以使用Queue来避免递归。像这样的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);
            }
        }
    }

但看起来在你的情况下你根本不需要递归/队列。请参阅其他答案。

答案 3 :(得分:0)

您的编译器很可能已经将此尾递归转换为循环。