Показать сообщение отдельно

  #32  
Старый 29.10.2007, 20:04
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Генерации кодов Грея. Пишу для тех, кто знает о чем я. Короче, как вы помните, чувак предложил рекурсивный алгоритм и все такое. Я чуть не попутал, когда убедился, что ту же самую последовательность можно сгенерировать практически одной строкой:

Код:
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.
 
Ответить с цитированием