У вас есть функция, которая всегда вводит интервал (в этом случае натуральные числа), эта функция возвращает результат, но на процессоре довольно дорога, имитируется sleep в этом примере:Как эффективно выполнять итерацию, когда известны некоторые результаты подсерий
function calculate($start, $end) {
$result = 0;
for($x=$start;$x<=$end;$x++) {
$result++;
usleep(250000);
}
return $result;
}
для того, чтобы быть более эффективным, есть массив старых результатов, который содержит интервал использовал результат функции для этого интервала:
$oldResults = [
['s'=>1, 'e'=>2, 'r' => 1],
['s'=>2, 'e'=>6, 'r' => 4],
['s'=>4, 'e'=>7, 'r' => 3]
];
Если я позвоню calculate(1,10)
функция должна иметь возможность вычислять новые интервалы на основе старых результатов и накапливать их. В этом конкретном случае старый результат должен принимать от 1 до 2, что добавляет старый результат от 2 до 6 и делает новый calculate(6,10)
и добавляет, что слишком. Учитывайте, что функция игнорирует старый сохраненный интервал от 4 до 7, поскольку было удобнее использовать 2-6.
Это визуальное представление задачи:
Конечно, в этом примере, calculate()
довольно просто, и вы можете просто найти конкретные пути решения этой проблемы вокруг него, но в реальном коде calculate()
является комплекс, и единственное, что я знаю, это то, что calculate(n0,n3)==calculate(n0,n1)+calculate(n1,n2)+calculate(n2,n3)
.
Я не могу найти способ решить проблему повторного использования старых данных, не используя кучу IF и foreach, я уверен, что существует более элегантный подход к решению этого вопроса.
Вы можете играть с code here.
Примечание: Я использую PHP, но я могу читать JS, Pyton, C и подобные языки.
Я действительно не понимаю, что вы хотите для того чтобы достигнуть. – vaso123
@Jimmmy моя ошибка, уже исправлена – DomingoSL
Является ли интервал '[start, end)' или '[start, end]' (т. Е. 'End' включен в интервал)? В вашей формуле для 'calculate', это кажется первым, но в коде это кажется вторым. – WhatsUp