Pseudocodice: il calcolo del totale in modo ricorsivo

voti
1

Mi è stato dato un requisito (sfida per me almeno) di scrivere una logica in un'applicazione. Ho a dare una logica di business in cui si deve eseguire le seguenti funzionalità

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

Ora lascia dire le batterie necessarie per fornire la corrente (A + B) siano 'X'

Inoltre ogni X può contribuire al consumo totale di corrente, quindi devo ricalcolare il consumo totale di corrente come primo passo compreso il consumo di corrente della batteria

vale a dire

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

Ora di nuovo dovrei calcolare le batterie necessarie. Diciamo questo come Y

vale a dire

di alimentazione A + B + X occorre numero Y di batterie.

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

Qualcuno mi può aiutare con la prima serie di pseudocodice? Qualsiasi tipo di suggerimento è anche apprezzato

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 ...
È pubblicato 04/03/2010 alle 19:32
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Mi sembra che la pseudo-codice è già lì, solo che non molto chiaro. Ma vedere se questo è ciò che si vuole:

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: È possibile utilizzare System.Linq se avete bisogno di funzioni per lavorare sulle liste, come Sum ().

Risposto il 04/03/2010 a 20:08
fonte dall'utente

voti
0

La questione non è molto chiara (come altri hanno notato nei commenti), quindi sarebbe utile se si potesse scrivere qualche esempio più concreto e specifico del calcolo. In ogni caso, mi sembra che hai qualche calcolo con una valutazione ed è necessario raggiungere un punto in cui il calcolo smette di cambiare.

In matematica, questo può essere designati con -punto fisso . Per una funzione data f (il calcolo) il punto fisso è un valore tale che x = f (x) (che significa che se si ricalcola nuovamente il valore, si fermerà cambiando). Non sono sicuro se questo può aiutare con l'implementazione, ma è sicuramente un concetto utile che si può usare quando si parla del problema.

Ecco un esempio di un metodo che calcola un punto fisso di una data funzione (utilizzando C # 3.0 Func<T, T>delegato). Il metodo è generico e deve essere in grado di confrontare i valori:

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 ha un esempio di calcolo del punto fisso di un cos funzione (vedi secondo grafico a destra), che è possibile implementare questo modo:

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

Questo è un modo molto generale per descrivere alcune loop che viene eseguito fino a quando trova un punto stabile di un calcolo. Tuttavia, la sua domanda non è molto chiaro, quindi questo non può essere quello che stai cercando ...

Risposto il 04/03/2010 a 20:10
fonte dall'utente

voti
0

Vorrei fare qualcosa sulla falsariga di quanto segue:

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;
}
Risposto il 04/03/2010 a 20:18
fonte dall'utente

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