Другие языки программирования и технологии

Задача в паскале: реализовать рекурсивный алгоритм, печатающий все подмножества множества {1,2...N}

N задаётся с клавиатуры, результат выводится на экран и сохраняется в файл (нужен хотя бы примерный алгоритм решения)
на самом деле существует взаимно однозначное соответствие подмножеств множества мощности N и чисел из интервала [0, 2^N-1]. Это соответствие устанавливается так: нолики/единички двоичной записи числа интерпретируются как включения/исключения элементов в подмножество.

так что алгоритм простой:

PROCEDURE Subset (x :Integer, k :Integer);
BEGIN

IF k = N THEN BEGIN
FOR k := 0 TO N-1 DO IF (x and (1 shl k)) <> 0 THEN Write(k+1, ' ');
WriteLn;
Exit;
END;

Subset (x, k+1);
Subset (x+(1 shl k), k+1);

END;

ну и вызывается она так:
Subset (0, 0);
Сергей Медведев
Сергей Медведев
76 960
Лучший ответ
Александр Гуров А где работа с файлом?
Александр Рыжков Недурно.... но она печатает не все подмножества, т. е. для {1 2 3} нужны ещё {21} {31} и {32}
В процедуре первым делом проверяем, не пустое ли множество, потом печатаем его, потом крутим цикл и вызываем ту же процедуру, удаляя по одному элементу.

Например есть множество 1 2
Не пустое - напечатали 1 2
вызвали с 1 - не пустое - напечатали 1 - вызвали с пустым - пустое - вышли.
вызвали с 2 - не пустое - напечатали 2 - вызвали с пустым - пустое - вышли.
Андрей Жарихин
Андрей Жарихин
69 152
Сгенерировать множество с N, убирать по 1 числу и печатать (всё множество без 1, всё множество без 2, и т. д.). Для каждого из подмножеств повторить алгоритм
(Ну и с дублями ещё поработать там)
PROCEDURE Subset (x :Integer, k :Integer);
BEGIN

IF k = N THEN BEGIN
FOR k := 0 TO N-1 DO IF (x and (1 shl k)) <> 0 THEN Write(k+1, ' ');
WriteLn;
Exit;
END;

Subset (x, k+1);
Subset (x+(1 shl k), k+1);

END;