Другие языки программирования и технологии
Задача в паскале: реализовать рекурсивный алгоритм, печатающий все подмножества множества {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);
так что алгоритм простой:
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);
Александр Гуров
А где работа с файлом?
Александр Рыжков
Недурно.... но она печатает не все подмножества, т. е. для {1 2 3} нужны ещё {21} {31} и {32}

В процедуре первым делом проверяем, не пустое ли множество, потом печатаем его, потом крутим цикл и вызываем ту же процедуру, удаляя по одному элементу.
Например есть множество 1 2
Не пустое - напечатали 1 2
вызвали с 1 - не пустое - напечатали 1 - вызвали с пустым - пустое - вышли.
вызвали с 2 - не пустое - напечатали 2 - вызвали с пустым - пустое - вышли.
Например есть множество 1 2
Не пустое - напечатали 1 2
вызвали с 1 - не пустое - напечатали 1 - вызвали с пустым - пустое - вышли.
вызвали с 2 - не пустое - напечатали 2 - вызвали с пустым - пустое - вышли.
Сгенерировать множество с 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;
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;
Похожие вопросы
- Задача в паскале: реализовать рекурсивный алгоритм правильности расстановки скобок
- написать программу на с++ (windows) и алгоритм для решения последовательности n! перестановок на множестве {1,2...n}
- вычислить в TP f(n)=1!+2!+..n!
- Решите задачу! Дано целое число n найдите сумму 1^n +2^n-1 + 3^n-2 ...+n^1
- Вычислить произведение n>=2 (n четное) сомножителей y=(2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7)*..
- Помогите пожалуйста! Задача по программированию. ВВОдится 1 число n. ВОзможны 2 действия над ним : 1)вычесть 1
- Pascal. Помогите пожалуйста решить задачу в паскале !
- Задача по Паскалю (1 курс)
- ПОМОГИТЕ! В паскале заполнить квадратный массив размерностью n числами 1,2,3… по спирали от края к центру по часовой стр
- <<ПОМОГИТЕ! НАПИСАТЬ ПРОГРАММУ НА СИ ИЛИ ПАСКАЛЕ КОТОРАЯ ВЫВОДИТЬ СУММУ ЦИФР ЧИСЛА ОТ 1 ДО N