Pseudokód: výpočet celkové rekurzivně

hlasů
1

Dostal jsem požadavek (náročné pro mě alespoň) psát logiku v aplikaci. Mám psát obchodní logiky, kde je třeba provést následující funkce

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

Nyní řekněme, že baterie potřebné dodávat proud (A + B) za ‚X‘

Také každý X může přispět k celkové spotřebě proudu, a tedy i potřeba znovu spočítat celkovou spotřebu proudu, stejně jako první krok včetně baterie současné spotřeby

tj

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

Nyní opět mám vypočítat baterií nutné. Řekněme, že to jako Y

tj

dodat + B + X“potřebujeme řadu Y baterií.

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

Může mi někdo pomoci s počátečním souborem pseudokódu? Jakýkoliv druh návrhu je také ocenili

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 ...
Položena 04/03/2010 v 19:32
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Zdá se mi, že pseudo-kód již existuje, ale ne příliš jasné. Ale uvidíme, jestli to je to, co chcete:

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: můžete použít System.Linq pokud potřebujete funkce pracovat na seznamech, jako je Sum ().

Odpovězeno 04/03/2010 v 20:08
zdroj uživatelem

hlasů
0

Otázkou je, není příliš jasné (jak je uvedeno v jiné komentáře), takže by bylo užitečné, pokud byste mohl napsat nějaký konkrétnější nebo konkrétní příklad výpočtu. V každém případě se mi zdá, že máte nějaké výpočty s zpětné vazby a je třeba dostat do bodu, ve kterém se výpočet zastaví mění.

V matematice, toto může být popsán pomocí pevnou řádovou čárkou . Pro danou funkci f (vaše kalkulace) Tento Fixpoint je hodnota taková, že x = f (x) (to znamená, že pokud znovu přepočítat hodnotu, přestane měnit). Nejsem si jistý, jestli to vám může pomoci při implementaci, ale je to určitě užitečný koncept, který můžete použít, když přemýšlel o problému.

Zde je příklad způsobu, který vypočítá s pevným bodem dané funkce (C # 3.0 Func<T, T>delegáta). Tato metoda je obecná a musí být schopen porovnat hodnoty:

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 má příklad výpočtu s pevnou řádovou o cos funkce (viz druhý graf vpravo), které můžete provádět takto:

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

Jedná se o velmi obecný způsob, jak popsat nějaký cyklování, který běží, dokud nenajde stabilní bod nějakého výpočtu. Nicméně, vaše otázka není zcela jasné, takže to nemusí být to, co hledáte ...

Odpovězeno 04/03/2010 v 20:10
zdroj uživatelem

hlasů
0

Chtěl bych dělat něco v tomto duchu z následujícího důvodu:

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;
}
Odpovězeno 04/03/2010 v 20:18
zdroj uživatelem

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