А все-таки на следующей странице оно понятнее (функция 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 пользователь Александр Коновалов < [email protected]> написал: > > А мой вариант на Си не структурный? У него один вход и один выход. > > Что и есть по вашему определению структурность. Или отреклись уже? :) > > Формально выход один, так что по сформулированному мной определению, да, > структурно. > > > При этом у меня процедура вроде правильно работает. А ваша на > > Алголе-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:[email protected]] > Sent: Thursday, August 10, 2017 11:57 AM > To: [email protected] > Subject: Re: FW: Рефал умер? > > > Красота. И никаких break’ов и goto. Структурное программирование :-) > > А мой вариант на Си не структурный? У него один вход и один выход. > Что и есть по вашему определению структурность. Или отреклись уже? :) > > При этом у меня процедура вроде правильно работает. А ваша на > Алголе-68 ошибится индексированием — операция and в Алголе-68 не ленивая :) > -- _______________ *С уважением, * *Аркадий Климов,* *с.н.с. ИППМ РАН,* *+7(499)135-32-95* *+7(916)072-81-48*
