Жуткая генерация подмножеств


#1
procedure Generate(A: array of integer; i: integer; Subset: sequence of integer);
begin
  if i = A.Length then 
    Subset.Println
  else
  begin
    Generate(A,i+1,Subset);   // не добавлять
    Subset := Subset + A[i]; 
    Generate(A,i+1,Subset); // добавить
  end;
end;
 
begin
  var A := Arr(5,3,8,13,15);
  var Subset := Seq&<integer>();
  Generate(A,0,Subset);
end.

Как говорят студенты - “Так работает же!”


#2

Я остановился на таком варианте. Буду рассказывать его на лекции:

procedure Generate(A: array of integer; i: integer; Subset: LinkedList<integer>);
begin
  if i = A.Length then 
    Subset.Println
  else
  begin
    Generate(A,i+1,Subset);   // не добавлять
    Subset.AddLast(A[i]); 
    Generate(A,i+1,Subset); // добавить
    Subset.RemoveLast;
  end;
end;
 
begin
  var A := Arr(5,3,8);
  var Subset := new LinkedList<integer>;
  Generate(A,0,Subset);
end.