MaxEdu.ru

Види циклів

1. Доти, поки не...

Повернемося до обчислення квадратного кореня (приклад 4.4):

X:=(a+1)/2; Y:=0.5*(X+a/X);

while abs(X-Y)>d do

begin

X:=Y; Y:=0.5*(X+a/X);

end;

Цей алгоритм задає послідовність дій такого вигляду:

X:= (a+1)/2;

Y:= 0.5*(X+a/X);

обчислення умови продовження: true;

X:=Y;

Y:= 0.5*(X+a/X);

обчислення умови продовження: true;



X:=Y;

Y:= 0.5*(X+a/X);

обчислення умови продовження: false.

Якщо в цій послідовності замінити найперший оператор на Y:=(a+1)/2; X:=Y, то вона буде циклічною, починаючи з другого оператора, і циклом буде

X:=Y;

Y:= 0.5*(X+a/X);

обчислення умови продовження

Можна було б подумати про оператор

do X:=Y;

Y:=0.5*(X+a/X);

while abs(X-Y)>d;

або в загальному вигляді

do послідовність операторів

while умова.

Такого оператора в мові Паскаль немає, а є схожий за виглядом

repeat

послідовність операторів

until умова

Він називається repeat-оператором, або оператором циклу з пост-умовою ("пост" означає "після"), і дослівно перекладається українською мовою як

повторювати

послідовність операторів

доти, поки не умова.

"Поки не" перетворює умову в умову завершення. Справа в тім, що спочатку виконується послідовність операторів (тіло), потім обчислюється умова, і якщо вона хибна, то знову виконується тіло тощо. Виконання оператора завершується після того, як при обчисленні умови одержано значення true. Таким чином, істинність умови означає завершення, а не продовження виконання всього оператора. Ми б назвали цей оператором циклу з умовою завершення, але такий термін у літературі не зустрічався.

Перепишемо алгоритм із прикладу 4.4 з використанням repeat-оператора. Цикл повинен починатися оператором X:=Y, тому перед циклом треба задати ініціалізацію Y. Умовою завершення повинно стати

not abs(X-Y)>d, або abs(X-Y)У діалекті Турбо Паскаль остання заборона відсутня. Крім того, при порівнянні k і hv насправді обчислюється значення виразу khv. Разом ці особливості дозволяють написати цикл for, тіло якого виконується аж ніяк не при значеннях параметра циклу, указаних у заголовку. Наприклад, для обчислення функції n!!, означеної за непарного n як 1 3 … n і як 2 4 … n за парного, в Турбо Паскаль можна, здавалося б, зробити такий трюк:

ff:=1; if odd(n) then lb:=1 else lb:=2;

{n і lb або обидва парні, або обидва непарні}

for k := lb to n do

begin ff:=ff*k; k:=k+1 end

Але це неправильно! Між двома послідовними виконаннями ff:=ff*k значення k збільшується двічі на 1 (явно і неявно), і, поки kn/2, то останній цикл також задає зайві обчислення. Наприклад, при n=8, k=7 тіло циклу виконується 7 разів, хоча значення 8 утворюється вже після першого виконання. Скористаємося тим, що , і напишемо остаточний варіант:

function C (n, k : integer) : integer;

var d : integer;

begin

if k > n div 2 then k:=n-k;

d:=1;

for i := 1 to k do d:=d*(n+1-i) div i;

C:=d

end;

Внимание, отключите Adblock

Вы посетили наш сайт со включенным блокировщиком рекламы!
Ссылка для скачивания станет доступной сразу после отключения Adblock!

Скачать
Рефераты по информатике 1. Доти, поки не... Повернемося до обчислення квадратного кореня (приклад 4.4): X:=(a+1)/2; Y:=0.5*(X+a/X); while abs(X-Y)>d do begin X:=Y;
Оценок: 391 (Средняя 5 из 5)

Специалисты RetsCorp работают в digital-сфере более 7 лет. За это время мы разработали более 500+ успешных проектов. Основываясь на своем опыте и знании рынка, мы с уверенностью можем сказать, что будет работать, а что — нет. Заказывая создание лендинга для бизнеса в нашей студии, вы получаете работающие решения, необходимые именно вашему бизнесу.

Сотрудничая с нами, вы будете не клиентом, а нашим партнером. Благодаря этому мы будем развивать ваш бизнес как собственный. Мы так же как и вы заинтересованы в успехе проекта, поскольку ваша успешность будет нашей рекламой.

© 2014 - 2022 MaxEdu.ru