Псевдокод: вычисление суммы рекурсивно - PullRequest
1 голос
/ 04 марта 2010

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

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

Теперь предположим, что батареи, необходимые для питания тока (A + B), равны 'X'

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

т.е. 1010 *

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

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

т.е. 1015 *

для питания 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 ...

Ответы [ 3 ]

0 голосов
/ 04 марта 2010

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

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

Вот пример метода, который вычисляет фиксированную точку данной функции (используя делегат 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;
}

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

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

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

0 голосов
/ 04 марта 2010

Я бы сделал что-то вроде следующего:

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;
}
0 голосов
/ 04 марта 2010

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

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 ().

...