@DaniilOLD
Питонист-мечтатель

Как оптимизировать код?

Можно ли оптимизировать данный код, хотя бы, чтобы было не 3 цикла, а 2?

Program laba1;
Var
  x, f, h, sum: real;
  n, k: integer;
  _:string;
Begin
  h:=0.1;
  x:=0.6;
  while x<=1.1 do
  begin
    for n:=10 to 15 do
    begin
      sum:=0;
      for k:=1 to n do
      begin
        sum:=sum + exp(ln(exp(ln(x)*(k+1))+(exp(x/k)))/(3*n));
      end;
      writeln(sum);
      f:=sum * sin(x/n) * (exp(ln(x)/3)/(ln((x/3)+2.5)/ln(10)));
      writeln('x=',x,' n=',n,' f=',f);
    end;
    x:=x + h;
  end;
  read(_);
End.

Вот сама задача:

614efef22e47a785543323.jpeg
Если что, там корень 3-ей степени.
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 5
@kalapanga
А что плохого в 3-х циклах? Само по себе количество циклов ни о чём не говорит. Надо 3 значит 3.
Один цикл уберётся только если по другому трактовать условие задачи. Например, что нужен расчёт не сразу для всех возможных значений n, а только для какого-то одного, задаваемого пользователем из диапазона от 10 до 15.
Ответ написан
HemulGM
@HemulGM Куратор тега Delphi
Delphi Developer, сис. админ
1. Read можно вызывать без указания аргументов. Т.е. просто readln;
2. Для вычисления корня можно написать простую функцию
uses Math;
function Sqrt(X: Extended; Base: Integer): Extended;
begin
  Result := Power(X, 1 / Base);
end;

sqrt(9, 3) = 2;
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Можно и в один цикл, только смысла особого в этом нет.
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
но надо, чтобы было <3 циклов
Тогда вынесите вычисление суммы в отдельную функцию.

Или: упражнение на внимательность.
for i := 0 to 5 do begin
 n := 10 + i;
 x := 0.6 + (h * i)
...
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Тут возможна оптимизация в переиспользовании вычисленных кусков выражения. Например, то что в знаменателе, зависит только от х, и тебе надо это вычислить и запомнить для каждого х, которое встретится. Сейчас ты уже не повторяешь это вычисление для каждого k, но пока повторяешь для каждого N
Выражение в числителе большой дроби можно представить как pow(x, 1/3) * pow(f(x, k), 3*n). Здесь соответственно тоже, pow(x, 1/3) зависит только от х, f(x, k) - только от x, k, и т.д.
В общем, мемоизация рулит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы