在Delphi中怎么实现排列组合

 我来答
windblast
2017-01-06 · 知道合伙人软件行家
windblast
知道合伙人软件行家
采纳数:5633 获赞数:13623
毕业于空军第一航空学院电子专业,1991年开始接触电脑,从事多年计算机编程,具有较丰富的经验。

向TA提问 私信TA
展开全部

提供排列、组合功能函数的源代码(代码源于网络)如下:

const
  BASIC_NUM :Array [0..9] of String = ('0','1','2','3','4','5','6','7','8','9');
  //BASIC_OBJ :Array [0..4] of String = ('Red', 'Green', 'Blue', 'White', 'Black');
  AMOUNT_NUM :Integer = 10;
  //AMOUNT_OBJ :Integer = 5;
  PARADE_TYPE :Integer = 0;
  COMBINE_TYPE :Integer = 1;

procedure Parade(nBase :Integer; Var sList :TStringList);
var
  ssList :TStringList;
  nIdx, nSidx :Integer;
begin
  ssList := TStringList.Create;
  try
    if (nBase < 1) then
    begin
      //do nothing
    end else
    begin
      if (sList.Count = 0) then
      begin
        for nIdx := 0 to AMOUNT_NUM-1 do
          ssList.Add(BASIC_NUM[nIdx]);
      end else
      begin
        for nIdx := 0 to AMOUNT_NUM-1 do
          for nSidx := 0 to sList.Count-1 do
              ssList.Add(BASIC_NUM[nIdx]+sList.Strings[nSidx]);
      end;
      Parade(nBase-1, ssList);
    end;

    if ssList.Count > 0 then
    begin
      sList.Clear;
      sList.Text := ssList.Text;
    end;

  finally
    ssList.Free;
  end;
end;

procedure Combine(nBase :Integer; Var sList :TStringList);
var
  ssList :TStringList;
  nIdx, nSidx :Integer;
begin
  ssList := TStringList.Create;
  try
    if (nBase < 1) then
    begin
      //do nothing
    end else
    begin
      if (sList.Count = 0) then
      begin
        //for nIdx := 0 to AMOUNT_OBJ-1 do
        for nIdx := 0 to AMOUNT_NUM-1 do
          //ssList.Add(BASIC_OBJ[nIdx]);
          ssList.Add(BASIC_NUM[nIdx]);
      end else
      begin
        //for nIdx := 0 to AMOUNT_OBJ-1 do
        for nIdx := 0 to AMOUNT_NUM-1 do
          for nSidx := 0 to sList.Count-1 do
            //if (Pos(BASIC_OBJ[nIdx], sList.Strings[nSidx]) = 0) then
            if (Pos(BASIC_NUM[nIdx], sList.Strings[nSidx]) = 0) then
              //ssList.Add(BASIC_OBJ[nIdx]+','+sList.Strings[nSidx]);
              ssList.Add(BASIC_NUM[nIdx]+sList.Strings[nSidx]);
      end;
      Combine(nBase-1, ssList);
    end;

    if ssList.Count > 0 then
    begin
      sList.Clear;
      sList.Text := ssList.Text;
    end;

  finally
    ssList.Free;
  end;
end;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式