बचना प्रत्यावर्तन

वोट
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एक ऑपरेशन है कि किसी भी भिन्नात्मक मूल्य लेता है और निकटतम पूर्णांक तक ऊपर दौर है। (। लगभग सभी वातावरण है कि आपरेशन है बस अपने नेट टैग देखा है, यह है Math.Ceiling नेट में; 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