From: Stanislav Baldanov <steve@mail.ru>
To: sapisoft@yandex.ru
Date: Wednesday, April 03, 2002, 4:07:09 AM
Subject: На счёт целесообразности использования процедуры для обмена значения с помощью xor
Здравствуйте.
Алексей Ильичёв, как вы думаете насколько оправдано использование той процедуры, которую вы представили?
Procedure swap(Var a, b : integer);
begin
a := a xor b;
b := a xor b;
a := a xor b;
end;
Вместо того чтобы использовать:
a := a xor b;
b := a xor b;
a := a xor b;
Вы будете использовать:
swap(a, b);
Да, конечно, это более кратко. Но этим вы напрочь "снесли" то преимущество, которое имеет непосредственное использование xor без вызова процедуры. А именно скорость и элегантность. И та проблема, о которой вы говорите, в таком случае отпадает за невозможностью её возникновения. Да и в вашем варианте она тоже немыслима. Зачем менять значениями а и а? Вы
может, и найдёте алгоритм, при котором возникает такая необходимость, но это будет говорить лишь о недостатках такого алгоритма.
В чём я не прав? |
From: Serhiy Serbin <serhiys@adarvo.com>
To: sapisoft@yandex.ru
Date: Thursday, April 04, 2002, 8:29:57 AM
Subject: "Хорошее" решение задачи, предложенной Serhiy Serbin в #25
Привет,
==================
From: Алексей Ильичёв <alex_z77@mail.ru>
To: sapisoft@yandex.ru
Date: Thursday, March 28, 2002, 11:43:46 PM
Subject: "Хорошее" решение задачи, предложенной Serhiy Serbin в #25
Зачем же уравнение прямой? Гораздо проще посмотреть знак векторного
произведения. Формула для нахождения векторного произведения через координаты
векторов очень простая: x2*y1-x1*y2.
Д.З.: посмотреть на примере, какой знак принимает это произведение при левом
повороте ;-)
==================
Ответ: Да конечно, это абсолютно правильное решение, по крайней мере, я так считаю, опираясь на свои математические знания:). Хочу только добавить, что < 0 для левого, больше для правого и = 0 для продолжения. Но все-таки, если взять уравнение прямой, то эту задачу можно решить чуть иначе.
Построим по точкам i - (i+1) уравнение прямой, конечно же, вида Ax + By + C = 0 (y = kx + b - это частный случай). Коэффициенты находятся однозначно, при условии что i и (i+1) - разные точки. Далее вычислим значение функции: Ax(i+2) +
By(i+2) + C, где x(i+2) и y(i+2) соотвественно координаты третей точки. Далее такое же правило, если больше нуля то правый, если меньше то левый, и равно 0 лежит на первоначальной прямой. Я просто хотел дополнительно подчеркнуть, что
знание этого факта также бывает полезно. Хотя согласен, что первое решение более оптимально :))
==================
From: Алексей Ильичёв <alex_z77@mail.ru>
To: sapisoft@yandex.ru
Date: Thursday, March 28, 2002, 11:16:56 PM
Subject: Ответ на ложное обвинение Yuri Y. Roumega, опубликованное в #25
2.Рекомендуется всем, кто не понял перечитать моё послание ещё разок ;-)
Имеется в виду именно процедура обмена и именно её вызов от одной и той же переменной. Процедура не будет разбираться, куда показывают указатели, переданные ей.
Procedure swap(Var a, b : integer);
begin
a := a xor b;
b := a xor b;
a := a xor b;
end;
Если в параметрах вызова указана одна и та же переменная, то после выполнения оператора a := a xor b обнулится не только A, но и B. Можете проверить на опыте.
Я бы не стал писать об этом, если бы сам несколько раз на этом не погорел...
==================
Ответ: опять-таки повторюсь, я не силен в синтаксисе Паскаля, но догадываюсь, что речь идет, конечно же, о ссылках на параметры. Просто нет смысла вызывать данную функцию, с параметрами по значению. И конечно, следующий вызов будет
ошибочный, если a <> 0: swap(a, a); Поэтому приведенное замечание абсолютно верно, но данное замечание следует рассматривать более в контексте реализации, а не с точки зрения теории:)) Но в любом случае факт полезный.
Best regards,
Serhiy Serbin |