Optymalizacja metody.

0

Witam,

Proszę o pokierowanie mnie co można jeszcze zoptymalizować w tej metodzie, ja już głupieje trochę, bo nie widzę żadnych lepszych opcji. Pomoże ktoś? Tu wklejam kawałek kodu:

Number SimplestBetween(Number left, Number right)
        {

            if (left == null && right == null)
                return new Number(0, 1);


            if (left == null)
            {

                if (right.value > 0)
                    return new Number(0, 1);
                else
                    return new Number((int)right.value - 1, 1);

            }

            if (right == null)
            {

                if (left.value < 0)
                    return new Number(0, 1);
                else
                    return new Number((int)left.value + 1, 1);
            }

            if (left.value < 0 && right.value > 0)
            {

                new Number(0, 1);    // jeżeli 0 jest dostępne to je wybiera
            }

            if (Math.Abs(left.value - right.value) > 1.0)
            {
                // wartość zwraca w postaci Integer'a

                if (right.value <= 0)
                    return new Number((int)right.value - 1, 1);
                if (left.value >= 0)
                    return new Number((int)left.value + 1, 1);
            }
            else
            {

                int currentAdding = 0;              // przelicza najprostszą funkcję pomiędzy lewym a prawym 
                int currentSubtracting = 1;

                int direction = 1;

                if (right.value <= 0)
                    direction = -1;


                Number currentNumber = new Number(currentAdding, currentSubtracting);

                while (currentNumber.value >= right.value || currentNumber.value <= left.value)
                {

                    currentAdding = 0;
                    currentSubtracting *= 2;

                    currentNumber = new Number(currentAdding, currentSubtracting);

                    int target = 0;

                    if (currentNumber.value >= right.value)
                        target = -1;


                    if (currentNumber.value <= left.value)
                        target = 1;

                    while (target == direction)
                    {

                        currentAdding += direction;

                        currentNumber = new Number(currentAdding, currentSubtracting);

                        target = 0;

                        if (currentNumber.value >= right.value)
                            target = -1;

                        if (currentNumber.value <= left.value)
                            target = 1;

                    }
                }
                return currentNumber;
            }
            throw new ArgumentException("Unable to find a number between: " + left + " and " + right);
        }

0

Co dokładnie zawiera klasa Number? Czy nie wystarczą Ci int jako parametry?
Czy klasa SimplestBetween ma za zadanie znaleźć i zwrócić dowolną liczbę pomiędzy left i right?

0
class Number
    {

        public Number(int adding, int subtracting)
        {

            this.adding = adding;
            this.subtracting = subtracting;
        }

        public Number()
        {
        }

        public int adding = 0;
        public int subtracting = 1;

        public double value { get { return adding / (double)subtracting; } }

        public static Number operator +(Number left, Number right)
        {

            int commonSubtracting = 0;

            if (left.subtracting > right.subtracting)
                commonSubtracting = left.subtracting;
            else
                commonSubtracting = right.subtracting;


            int sum = (commonSubtracting / left.subtracting) * left.adding + (commonSubtracting / right.subtracting) * right.adding;

            return new Number(sum, commonSubtracting);
        }

        public override string ToString()
        {

            return adding.ToString() + "/" + subtracting.ToString() + " (" + value + ")";
        }
    }

Właśnie w taki sposób to według mnie musi być wykonane, ogólnie program rozwiązuje problem takiego zadania :

Rozważmy następującą grę, w której rekwizytami są białe i czar- ne krążki ułożone w kilku stertach. Ruch polega na wybraniu jednego z krążków własnego koloru z dowolnej sterty, a następ- nie zdjęciu go wraz ze wszystkimi krążkami leżącymi nad nim. Zdjęte krążki nie uczestniczą już w dalszej grze. Wygrywa ten, kto wykonał ruch jako ostatni. Wyszukuje wartość gry.

1 użytkowników online, w tym zalogowanych: 0, gości: 1