查找数组长度为n的子集(给定集) - Pascal

时间:2014-11-30 18:31:07

标签: pascal

给定n个元素的{1,2,3,4,5 ...}个集合,我们需要找到长度为k的所有子集。

例如,如果n = 4且k = 2,则输出将为{1,2},{1,3},{1,4},{2,3},{2,4},{ 3,4}。

拜托,我知道我必须通过递归来做,但我不知道如何开始......任何人都可以帮助我在Pascal中如何做到这一点?

非常感谢!!!

1 个答案:

答案 0 :(得分:0)

对我自己感兴趣,这里是Free Pascal中的代码:

PROGRAM SubSets;

USES
   SysUtils;

TYPE
   TSubArray = ARRAY OF Integer;

PROCEDURE PrintSet(SubSet : TSubArray);

VAR
   i : Integer;
   h : Integer;

BEGIN
   h := High(SubSet);
   Write('{');
   FOR i := 0 TO h DO
   BEGIN
      Write(SubSet[i]);
      IF i < h THEN Write(',');        
   END;
   Write('} ');
END;

PROCEDURE FindSets(Start, Stop, Pos : Integer; SubSet : TSubArray);

VAR
   i : Integer;
   HighIndex : Integer;
   MaxFirst  : Integer;

BEGIN
   HighIndex := High(SubSet);
   IF Pos = HighIndex THEN
   BEGIN
      FOR i := Start TO Stop DO
      BEGIN
         SubSet[Pos] := i;
         PrintSet(SubSet);
      END;
   END ELSE BEGIN
      MaxFirst := Stop - (HighIndex - Pos);    
      FOR i := Start TO MaxFirst DO
      BEGIN
         SubSet[Pos] := i;
         FindSets(i+1, Stop, Pos+1, SubSet);
      END;
   END;
   WriteLn;
END;

VAR
   k, n   : Integer;
   SubSet : TSubArray;

BEGIN
   IF ParamCount = 2 THEN
   BEGIN
      k := StrToInt(ParamStr(1));
      n := StrToInt(ParamStr(2));
      SetLength(SubSet, n);
      FindSets(1, k, 0, SubSet);
   END;
END.

还有一些输出:

C:\Users\Kitana>subsets 6 3
{1,2,3} {1,2,4} {1,2,5} {1,2,6}
{1,3,4} {1,3,5} {1,3,6}
{1,4,5} {1,4,6}
{1,5,6}

{2,3,4} {2,3,5} {2,3,6}
{2,4,5} {2,4,6}
{2,5,6}

{3,4,5} {3,4,6}
{3,5,6}

{4,5,6}



C:\Users\Kitana>
相关问题