Псевдокод: вычисления общей рекурсивно

голоса
1

Я получил требование (оспаривая для меня по крайней мере), чтобы написать логику приложения. Я писать бизнес-логику, в которой она должна выполнять следующие функции

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

Теперь давайте говорить батареи , необходимые для подачи тока (А + В) «X»

Кроме того, каждый Х может внести свой вклад в общее потребление тока, следовательно, я должен рассчитать общее потребление тока снова только в качестве первого шага, включая батареи потребление тока

т.е.

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

Теперь снова я должен рассчитать батареи требуется. Будем говорить, это как Y

т.е.

для питания A + B + X»нам нужно Y число батарей.

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

Может кто-нибудь помочь мне с начальным набором псевдокода? Любой вид внушения также ценится

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 ...
Задан 04/03/2010 в 19:32
источник пользователем
На других языках...                            


3 ответов

голоса
0

Мне кажется, что псевдо-код уже есть, только не очень понятно. Но увидеть, если это то, что вы хотите:

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: Вы можете использовать System.Linq если вам нужны функции для работы со списками, как Sum ().

Ответил 04/03/2010 в 20:08
источник пользователем

голоса
0

Вопрос не очень понятно (как другие отмечали в комментариях), поэтому было бы полезно, если бы вы могли бы написать какой-нибудь более конкретное или конкретный пример расчета. Во всяком случае, мне кажется, что у вас есть некоторые вычисления с обратной связью, и вы должны достичь точки, в которой расчет перестанет изменяться.

В математике, это может быть описано с использованием фиксированной точки . Для заданной функции F (ваш расчет) Fixpoint это значение , такое , что х = е (х) ( это означает , что если вы снова пересчитывать значение, он перестает изменяться). Я не уверен , если это может помочь вам с вашей реализацией, но это, безусловно , полезным понятием , которое вы можете использовать , когда речь идет о проблеме.

Ниже приведен пример способа , который вычисляет фиксированную точку заданной функции ( с использованием C # 3.0 Func<T, T>делегата). Метод является универсальным и должен быть в состоянии сравнить значение:

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;
}

В Википедии есть пример вычисления с фиксированной точкой соз функции (см второй график справа), который вы можете осуществить следующим образом:

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

Это очень общий способ описать некоторое зацикливание, который работает до тех пор, пока не найдет устойчивую точку некоторого расчета. Тем не менее, ваш вопрос не очень ясно, так что это не может быть то, что вы ищете ...

Ответил 04/03/2010 в 20:10
источник пользователем

голоса
0

Я хотел бы сделать что-то вдоль линий следующего:

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;
}
Ответил 04/03/2010 в 20:18
источник пользователем

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