Αποφυγή αναδρομή

ψήφοι
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

Είναι πολύ πιθανό ότι compiler σας έχουν ήδη μετατραπεί αυτή η ουρά αναδρομή σε ένα βρόχο.

Απαντήθηκε 15/03/2010 στις 10:05
πηγή χρήστη

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