Pseudocod: calcul total recursiv

voturi
1

Mi sa dat o cerință (o provocare pentru mine cel puțin) pentru a scrie o logică într-o aplicație. Am să scrie o logică de afaceri în care trebuie să îndeplinească următoarele funcții

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

Acum , vă permite să spun bateriile necesare pentru a furniza curent (A + B) să fie „X“

De asemenea, fiecare X poate contribui la consumul total de curent, prin urmare, am nevoie pentru a calcula consumul total de curent din nou, la fel ca prim pas, inclusiv consumul de curent a bateriei

și anume

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

Acum, din nou, ar trebui să i se calculeze bateriile necesare. Să spunem acest lucru ca Y

și anume

pentru aprovizionare A + B + X“avem nevoie de numărul Y de baterii.

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

Poate cineva să mă ajute cu un set inițial de pseudocod? Orice fel de sugestie este, de asemenea, apreciat

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 ...
Întrebat 04/03/2010 la 19:32
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Mi se pare că pseudo-cod este deja acolo, pur și simplu nu foarte clar. Dar a vedea dacă acest lucru este ceea ce doriți:

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: Puteți utiliza System.Linq dacă aveți nevoie de funcții pentru a lucra pe liste, cum ar fi suma ().

Publicat 04/03/2010 la 20:08
sursa de către utilizator

voturi
0

Problema nu este foarte clar (așa cum alții remarcat în comentarii), asa ca ar fi util dacă ați putea să scrieți un exemplu mai concret sau specifice calculului. Oricum, mi se pare că ai unele calcule, cu un feedback și aveți nevoie pentru a ajunge la un punct în care calculul nu se mai schimbă.

În matematică, aceasta poate fi descrisă cu ajutorul unui punct fix . Pentru o anumită funcție f (calculul dvs.) este punctul fix o valoare astfel încât x = f (x) (ceea ce înseamnă că , dacă recalcula din nou valoarea, se va opri în schimbare). Nu sunt sigur dacă acest lucru vă poate ajuta cu implementarea, dar este cu siguranta un concept util pe care îl puteți utiliza când gândesc la problema.

Aici este un exemplu al unei metode care calculeaza un punct fix al unei funcții date (folosind C # 3.0 Func<T, T>delegat). Metoda este generic și trebuie să fie în măsură să compare valorile:

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 are un exemplu de calcul al punctului fix al unui cos funcție ( a se vedea al doilea grafic pe dreapta), pe care o puteți pune în aplicare astfel:

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

Acesta este un mod foarte general pentru a descrie unele buclare care rulează până găsește un punct stabil de unele calcule. Cu toate acestea, întrebarea dvs. nu este foarte clar, astfel încât aceasta să nu fie ceea ce căutați ...

Publicat 04/03/2010 la 20:10
sursa de către utilizator

voturi
0

Mi-ar face ceva de-a lungul liniilor de următoarele:

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;
}
Publicat 04/03/2010 la 20:18
sursa de către utilizator

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