给定n个元素的{1,2,3,4,5 ...}个集合,我们需要找到长度为k的所有子集。
例如,如果n = 4且k = 2,则输出将为{1,2},{1,3},{1,4},{2,3},{2,4},{ 3,4}。
拜托,我知道我必须通过递归来做,但我不知道如何开始......任何人都可以帮助我在Pascal中如何做到这一点?
非常感谢!!!
答案 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>