Здравствуйте, VsevolodC, Вы писали:
VC>Здравствуйте, adontz, Вы писали:
A>>Здравствуйте, Аноним, Вы писали:
A>>А почему бы не вычилять по требованию? То есть типа так
A>>A>>int calculate()
A>> {
A>> static bool is_caculated = false;
A>> static int precalulated_result;
A>> if (!is_calculated)
A>> {
A>> precalculated_result = .... /* тут и вычисляем */
A>> is_calculated = true;
A>> }
A>> return precalculated_result;
A>> }
A>>
A>>Тогда
A>>1) всё вычислится в порядке учитывающем зависимости
A>>2) каждый результат будет вычисляться только 1 раз
A>>3) результаты которые в некоторой ситуации не нужны вычислены не будут
A>>4) никаких сортировок не надо, всё делается само.
VC>Это здорово, если есть уверенность в правильности исходных данных. А если там цикл?
Вот это обнаружит заодно и цикл.
void calculate(Expression e) {
if (inProgress[e]) throw "Circular dependency detected";
if (e.value hasn't been calculated yet) {
inProgress[e] = true;
foreach dep in e.dependencies {
calculate(dep);
}
inProgress[e] = false;
e.value = e.evaluate();
}
}