呵呵,赶巧了,刚写过,贴份原码,递归和非递归的两种。
递归的:
//-------------------------------------------
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure zhuhe(n,k:integer;str:string);
var
i:integer;
begin
if n = k then
begin
for i:=ndo
wnto 1do
str := inttostr(i) + ',' + str;
writeln(str);
exit;
end;
if k = 1 then
begin
for i:=1 to ndo
writeln(inttostr(i) + ',' + str);
exit;
end;
zhuhe(n-1,k,str);
zhuhe(n-1,k-1,inttostr
+ ',' +str);
end;
begin
zhuhe(29,7,'');
readln;
end.
非递归;
//--------------------------------------------------------------
解二,非递归;要求选的数字大于1
type
TForm1 = class(TForm)
ListBox1: TListBox;//用于显示结果
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
m = 3;//随便改,只要m<=n
n = 5;
var sum : integer;//记录当前输出的是第几个答案
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j :integer;
p : array of integer;//指针数组,其内容为选取的数在s中的标号
//长度为m
s : array of integer;//源数组 长度为n
str : string;//输出结果暂存
begin
//初始化p
//此处缺m是否为1的判断,应加入;
setlength(p,m);
for i := 0 to m-1do
p
:=i;
p[m-1] := p[m-2];
//改;
//初始化s
setlength(s,n);
for i := 0 to n-1do
s:=i;//此处的赋值,可根据你的需要
sum := 0;
while truedo
begin
inc(p[m-1]);
str :='';
//得到一个结果
for j:=0 to length(p)-1do
str := str+inttostr(S[p[j]])+',';
//output
listbox1.items.add('---------------');
inc(sum);
listbox1.items.add(inttostr(sum));
listbox1.items.add(str);
//如果所有指针都排到s之末尾,则找到所有解
//结束循化
if p[0]=(n-m) then
break;
//将指针往后移动
//以遍历所有的数
for i:=1 to m-1do
if p=n-(m-i) then
begin
p[i-1]:= p[i-1]+1;
for j:=i to m-2do
p[j] := p[j-1]+1;
p[m-1]:=p[m-2];
break;
end;
end;
//while
end;
保证可以用的,给分了。