组合算法:从m个数中选n个数的所有组合
Delphi 用递归的  有谁写过吗?

解决方案 »

  1.   

    每个数之间要求用','隔开procedure TForm1.Button1Click(Sender: TObject);
    var
      s1,s2:string;
      str,str1:TStrings;
      i,j,m,n:Integer;
    begin
      s1:=Trim(self.Edit1.Text);
      s2:=Trim(self.Edit2.Text);
      if (s1='') or (s2='') then
        Exit;
      str:=TStringList.Create;
      str.Clear;
      str1:=TStringList.Create;
      str1.Clear;
      self.getn(s1,'',StrToInt(s2),str);
      i:=str.Count;
      self.Memo1.Lines.Clear;
      for j:=0 to i-1 do
      begin
        s1:=str.Strings[j];
        self.Memo1.Lines.Add(s1);
      end;
    end;procedure TForm1.getn(ss, ss1: string; count: Integer; var str: TStrings);
    var
      i,j,m,n:Integer;
      s,s1,s2,s3:string;
      str1,str2:TStrings;
    begin
      str1:=TStringList.Create;
      str1.Clear;
      str2:=TStringList.Create;
      str2.Clear;
      ExtractStrings([','],[],PChar(ss),str1);
      i:=str1.Count;
      if i=0 then
        Exit;
      for j:=1 to i do
      begin
        s1:=str1.Strings[j-1];
        if ss1='' then
          s3:=ss1+s1
        else
          s3:=ss1+'|'+s1;
        str2.Clear;
        ExtractStrings(['|'],[],PChar(s3),str2);
        if str2.Count=count then
        begin
          str.Add(s3);
          Continue;
        end;
        s2:='';
        for n:=j to i-1 do
          s2:=s2+str1.Strings[n]+',';
        Self.getn(s2,s3,count,str);
      end;
    end;
      

  2.   

    忘了写说明了
    getn(ss, ss1: string; count: Integer; var str: TStrings);
    ss:原m个数组成的字符串,每个数之间用','隔开;
    ss1:分析出的数值字符串,初始值为空
    count:就是那个n了
    str:用于存放所有n个数组成的字符串队列
      

  3.   

    OR = {1,2,3,4}, n = 4, r = 3则组合为:
    {1,2,3}; {1,2,4}; {1,3,4}; {2,3,4}.
    C语法算法如下:
    int n, r;
    int C[5];
    char used[5];
     
    void combine(int pos, int h)
    {
    int i;
    /*如果已选了r个元素了,则打印它们*/
        if (pos==r) {
            for (i=0; i<r; i++)
                cout<< C[i];
            cout<< endl;
            return;
        }
        for (i=h; i<=n-r+pos; i++) /*对于所有未用的元素*/
            if (!used[i]) {
    /*把它放置在组合中*/
                C[pos] = i;
    /*使用该元素*/
     used[i]++;
    /*搜索第i+1个元素*/
         combine(pos+1,i+1);
    /*恢复递归前的值*/
     used[i]--;
            }
    }