Pseudocódigo: computar el total de forma recursiva

votos
1

Se me ha dado un requisito (un reto para mí por lo menos) para escribir una lógica en una aplicación. Tengo que escribir una lógica de negocio en el que se debe llevar a cabo las siguientes funciones

Total current consumption = current from A elements + current from B elements.
A and B are different types of devices

Ahora digamos que las baterías necesarias para suministrar la corriente (A + B) sean 'X'

También cada X puede contribuir al consumo total de corriente, por lo tanto, i necesidad de calcular el consumo total de corriente de nuevo sólo como primer paso, incluyendo el consumo de corriente de la batería

es decir

`Total current consumed : A + B + X`  
where X is the current consumption of the battery 

Ahora, de nuevo yo debería calcular las baterías requeridas. Digamos esto como Y

es decir

al suministro de A + B + X necesitamos Y número de baterías.

Now check whether X == Y ?
If same, then return Y and exit 
else add more X to the sum (A + B  + X) till X == Y

¿Puede alguien ayudarme con el conjunto inicial de pseudocódigo? Cualquier tipo de sugerencia También se aprecia

Yes the end result this logic should return is number of batteries required. However it should return this result only after computing the total current consumption recursively till X == Y, where 
A : total current consumption of some active elements in a system.
B : total current consumption of some passive elements in a system

Total current consumption is A + B
to supply current of (A+B) amperes i require 'X' no. of batteries.
However each battery also adds some delta amount of current to the total value i.e 
A + B + X
if the batteries required to supply this delta is still 'X', then return X as the end result, else add more batteries --> calculate current --> no of batteries required ---> check again and so on ...
Publicado el 04/03/2010 a las 19:32
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

Me parece que el pseudo-código que ya está ahí, pero no es muy clara. Pero si esto es lo que quiere:

private const decimal CurrentSuppliedPerBattery = 100;
private const decimal CurrentNeededPerBattery = 5;
private int BatteriesNeeded( List<A> As, List<B> Bs) {
    decimal currentToSupply = As.Sum( eachA => eachA.Current ) + Bs.Sum( eachB => eachB.Current );
    int batteries = 0;
    while(currentToSupply > 0)
    {
        int extraBatteries = Floor(1.0*currentToSupply/CurrentSuppliedPerBattery );
        batteries += extraBatteries;
        currentToSupply -= extraBatteries*CurrentSuppliedPerBattery;
        currentToSupply += extraBatteries*CurrentNeededPerBattery;
    }
    return batteries ;
}

PS: Se puede utilizar System.Linq si necesita funciones para trabajar en las listas, como suma ().

Respondida el 04/03/2010 a las 20:08
fuente por usuario

votos
0

La pregunta no es muy clara (como otros han dicho en los comentarios), por lo que sería útil si usted podría escribir algún ejemplo más concreto o específico del cálculo. De todos modos, me parece que tiene algo de cálculo con una retroalimentación y hay que llegar a un punto en el que el cálculo deja de cambiar.

En matemáticas, esto puede ser descrito usando un punto fijo . Para una función dada f (el cálculo) del punto fijo es un valor tal que x = f (x) (lo que significa que si se vuelve a calcular el valor de nuevo, se detendrá el cambio). No estoy seguro de si esto le puede ayudar con su aplicación, pero es sin duda un concepto útil que se puede utilizar cuando se piensa en el problema.

Aquí es un ejemplo de un método que calcula un punto fijo de una función dada (usando C # 3.0 Func<T, T>delegado). El método es genérico y tiene que ser capaz de comparar los valores:

static T FixedPoint<T>(T initial, Func<T, T> calculateNext) 
    where T : IComparable<T> {
  T state = initial;
  T previous = default(T);
  do {
    previous = state;
    state = calculateNext(state);
  } while (previous.CompareTo(state) != 0);
  return state;
}

Wikipedia tiene un ejemplo de cálculo de punto fijo de un cos función (véase el segundo gráfico de la derecha), que se puede aplicar la siguiente manera:

double val = FixedPoint(-1.0, f => Math.Cos(f));
Console.WriteLine(val);

Esta es una manera muy general para describir algunas de bucle que se ejecuta hasta que encuentra un punto de algún cálculo estable. Sin embargo, su pregunta no es muy clara, por lo que este puede no ser lo que busca ...

Respondida el 04/03/2010 a las 20:10
fuente por usuario

votos
0

Me gustaría hacer algo en la línea de lo siguiente:

double CurrentFromEachBattery=100.0;
double CurrentNeededPerBattery=10.0;

int NumberOfBatteriesRequired(double activeCurrent, double passiveCurrent)
{
    int batteries=0;
    double currCurrent=0.0;
    double neededCurrent=activeCurrent+passiveCurrent;

    while( currCurrent < neededCurrent )
    {
        int newBatt = Math.Ceiling((neededCurrent - currCurrent) / CurrentFromEachBattery);
        neededCurrent += newBatt * CurrentNeededPerBattery;
        currCurrent += newBatt * CurrentFromEachBattery;
        batteries += newBatt;
    }

    return batteries;
}
Respondida el 04/03/2010 a las 20:18
fuente por usuario

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