Pseudokod: obliczanie sumy rekurencyjnie

głosy
1

I nadano wymogu (wyzwanie dla mnie przynajmniej) napisać logikę w aplikacji. Mam napisać logikę biznesową w którym powinien on wykonywać następujące funkcje

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

Teraz powiedzmy, że baterie zobowiązany dostarczyć aktualny (a + b) być „X”

Również każdy X może przyczynić się do całkowitego poboru prądu, a więc muszę ponownie obliczyć całkowity pobór prądu tylko jako pierwszy krok w tym pobór prądu z akumulatora

to znaczy

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

Teraz znowu mam obliczyć akumulatory wymagane. Powiedzmy to jako Y

to znaczy

do zasilania + B + X”musimy liczbę Y 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

Czy ktoś może mi pomóc w początkowym zestawie Pseudokod? Wszelkiego rodzaju propozycja jest również mile widziane

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 ...
Utwórz 04/03/2010 o 19:32
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Wydaje mi się, że pseudo-kod jest już tam, po prostu nie bardzo jasne. Ale, czy to, co chcesz:

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: Można użyć System.Linq jeśli potrzebujesz funkcji do pracy na listach, jak Sum ().

Odpowiedział 04/03/2010 o 20:08
źródło użytkownik

głosy
0

Pytanie nie jest bardzo jasne (jak inni zauważyć w komentarzach), więc dobrze byłoby gdyby można napisać jakiś bardziej konkretny lub konkretny przykład obliczenia. W każdym razie wydaje mi się, że masz jakieś obliczeniowy ze sprzężeniem zwrotnym i trzeba dotrzeć do punktu, w którym obliczanie przestanie się zmieniać.

W matematyce, może być opisana za pomocą stałej punkt . Dla danej funkcji f (Twój obliczeń) fixpoint to wartość taka, że x = f (x) (co oznacza, że jeśli ponownie przeliczyć wartości, to przestaje się zmieniać). Nie jestem pewien, czy to może pomóc w realizacji, ale jest to z pewnością użyteczne pojęcie, które można użyć, gdy myśli o problemie.

Poniżej przedstawiono przykład sposobu, który oblicza stałoprzecinkowych danej funkcji (C # 3.0 Func<T, T>pełnomocnik). Metoda ta jest nazwą rodzajową i musi być w stanie porównać wartości:

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 ma przykładowe wyliczenia stałoprzecinkowych o cos funkcji (patrz drugi wykres po prawej), który można wdrożyć tak:

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

Jest to bardzo ogólny sposób, aby opisać pewne zapętlenie, który działa aż znajdzie stabilnego punktu jakiegoś obliczenia. Jednak twoje pytanie nie jest bardzo jasne, więc to nie może być to, czego szukasz ...

Odpowiedział 04/03/2010 o 20:10
źródło użytkownik

głosy
0

Chciałbym zrobić coś wzdłuż linii, co następuje:

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;
}
Odpowiedział 04/03/2010 o 20:18
źródło użytkownik

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