一个组合数的求解谈开去

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  解法三、
  以上两解也可用集合来实现。
  再想想,以上两解都是用了多重循环,必须定义多个循环变量,通用性似乎差了点。
  观察这些循环(尤其是解一),形式是何等的一致!
  也许诸位已经想到我要用递归调用来解决这个问题了。
  要设计递归,首先要确定哪些变量是必须向这个函数传递的,容易知道,调用时要知道当前元素的起始下标与终止下标,当然还有两个必不可少的参数就是我这个函数计算的是从多少选多少的,这样就确定了四个参数。
  还有一个要注意的地方,是递归何时显示数据?显然应当在求最后一个元素时。
  (关于递归调用的一些详细的论述,可以参看乔林的《参透Delphi/Kylix》一书或其它教材)
  
  请看实现:
  全局变量
  var
  GIDX:array[1..20] of integer; // 记录下标的数组。

  procedure MyRecur(Total,SelCnt,BLoc,ELoc:integer);
  var
  idx,jjj:integer;
  tmpStr:string;
  begin
  if (ELoc=Total) // 终止状态
  then begin
  for idx:=BLoc to ELoc do
  begin
  GIDX[SelCnt+ELoc-Total]:=idx; // 注意此处应与下面 8888处一致
  tmpStr:='';
  for jjj:=1 to SelCnt do tmpStr:=tmpStr+IntToStr(Value[GIDX[jjj]])+' ';
  Form1.Memo1.Lines.Add(tmpStr);
  end;
  end
  else begin
  for idx:=BLoc to ELoc do
  begin
  GIDX[SelCnt+ELoc-Total]:=idx; // 8888
  MyRecur(Total,SelCnt,idx+1,ELoc+1);
  end;
  end;
  end;

  procedure SelNumber(Total,SelCnt:integer);
  begin
  if (Total<1) or (Total<SelCnt)
  then begin
  ShowMessage('数据不正确!');
  Exit;
  end;

  MyRecur(Total,SelCnt,1,Total-SelCnt+1);  // 最初第三个参数总为1
  end;

  使用:
  procedure TForm1.Button3Click(Sender: TObject);
  var
  ttl,sel:integer;
  begin

  Memo1.Clear;
  ttl:=StrToInt(Edit1.Text);  // 请自己加上对TEdit的容错处理。
  sel:=StrToInt(Edit2.Text);
  SelNumber(ttl,sel);   
  end;

  好了,在Edit1中输入‘100’,在Edit2中输入'3',执行试试,三十多万行的数据不断地滚出来了吧。
  建议在计算前先估算一下共多少组合,最好不要超过10万。

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答