Генерации кодов Грея. Пишу для тех, кто знает о чем я. Короче, как вы помните, чувак предложил рекурсивный алгоритм и все такое. Я чуть не попутал, когда убедился, что ту же самую последовательность можно сгенерировать практически одной строкой:
Код:
for i := 0 to N-1 do
writeln(i xor (i div 2));
Какая нах рекурсия!!!
Пример использования. Генерация всех подмножеств множества:
Код:
{$apptype console}
var
U: array[0..3] of byte = (1, 2, 3, 4);
i,k: integer;
function checkbit(d, i: integer): boolean;
begin
if (d and (1 shl i)) = 0 then
result := false
else
result := true;
end;
begin
writeln('Dano: { 1 2 3 4 }'#13#10);
for i := 0 to 16 - 1 {16 - 2^N, N=4 - мощность множества} do
begin
write('{ ');
for k := 4-1 {N-1} downto 0 do
if checkbit((i xor (i div 2)), k) then
write(U[4-1 {N-1} -k],' ');
writeln('}');
end;
readln;
end.
Также хочу показать простой способ построения таблиц истиности логических выражений. Допустим, нужно построить:
Код:
X or (Y and Z)
| X | Y | Z | Y and Z | X or (Y and Z) |
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
Вот так это делается быстро и красиво:
Код:
{$apptype console}
type
myBool = 0..1;
var
X,Y,Z: myBool;
i: integer;
function checkbit(d, i: integer): myBool;
begin
if (d and (1 shl i)) = 0 then
result := 0
else
result := 1;
end;
begin
writeln('X or (Y and Z)');
writeln('| X | Y | Z | Y and Z | X or (Y and Z) |');
for i := 0 to 7 do
begin
X := checkbit(i,2);
Y := checkbit(i,1);
Z := checkbit(i,0);
write('| ',X,' | ',Y,' | ',Z,' | ',Y and Z,' | ',X or (Y and Z),' |');
writeln;
end;
readln;
end.