А все-таки на следующей странице оно понятнее (функция siftDown):

https://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0

Фишка в том, что для выхода из цикла while здесь имеются две разные
причины:
1) у данной текущей вершины p (там i) нет потомков (2*p+1>=n) или
2) потомки есть (один или два), но все они (в частности, больший, который
обозначен через j) имеют значение a меньшее (или равное) текущей (x, там
a[i]). И потому для второго выхода там используется break, т.е.
неструктурность.
А чтобы добиться структурности вам приходится эти два условия соединить в
одно через "или" и тут же в скобках под while вписать все что надо для их
вычисления. Да к тому же обеспечить доступ в теле цикла к вычисленному
внутри условий индексу j, объявив j вне цикла. Стало, конечно, структурно,
но более запутанно.

(Программы однако разные, т.к. у вас строится пирамида для максимума, а там
для минимума, что не суть.)


10 августа 2017 г., 16:14 пользователь Александр Коновалов <
a.v.konovalo...@mail.ru> написал:

> > А мой вариант на Си не структурный?  У него один вход и один выход.
> > Что и есть по вашему определению структурность.  Или отреклись уже? :)
>
> Формально выход один, так что по сформулированному мной определению, да,
> структурно.
>
> > При этом у меня процедура вроде правильно работает.  А ваша на
> > Алголе-68 ошибится индексированием — операция and в Алголе-68 не ленивая
> :)
>
> Спасибо, поправил. :-)
>
> proc sift = (ref [] T a, int n, int p) void: (
>   int j;
>   T x := a[p];
>   while (
>     if j := 2*p + 1; (j + 1 < n | a[j] < a[j + 1] | false) then  j +:= 1;
>     (j < n| a[j] > x | false)
>   ) do
>     a[p] := a[j]; p := j
>   od;
>   a[p] := x
> )
>
> Заодно понял, для чего нужна сокращённая запись if.
>
> -----Original Message-----
> From: Boyko Bantchev [mailto:boyk...@gmail.com]
> Sent: Thursday, August 10, 2017 11:57 AM
> To: refal@botik.ru
> Subject: Re: FW: Рефал умер?
>
> > Красота. И никаких break’ов и goto. Структурное программирование :-)
>
> А мой вариант на Си не структурный?  У него один вход и один выход.
> Что и есть по вашему определению структурность.  Или отреклись уже? :)
>
> При этом у меня процедура вроде правильно работает.  А ваша на
> Алголе-68 ошибится индексированием — операция and в Алголе-68 не ленивая :)
>



-- 
_______________
*С уважением, *
*Аркадий Климов,*
*с.н.с. ИППМ РАН,*
*+7(499)135-32-95*
*+7(916)072-81-48*

Ответить