代码片断
1 全排列历遍(递归法)
使用方法
2 组合历遍(递归法)
C++版本
使用
使用
1 全排列历遍(递归法)
使用方法
Combination(0,5,outputdata);// alldata[0]需要初始化成全排列所包括的元素,alldata[1]到alldata[5]是递归时的临时数据,无需处理。
代码int alldata[6][6];
int outputdata[6];
void Combination(int level,int datalen,int *output)
{
if(datalen >1)
{
for(int j=0;j<datalen;j++)
{
int n=0;
for(int k=0;k<datalen;k++)
{
if(k!=j)
{
alldata[level+1][n] = alldata[level][k];
n++;
}
}
output[0] = alldata[level][j];
Combination(level+1,datalen-1,output + 1);
}
}else
{
output[0] = alldata[level][0];
// 一次排列完成,插入处理函数
}
}
int outputdata[6];
void Combination(int level,int datalen,int *output)
{
if(datalen >1)
{
for(int j=0;j<datalen;j++)
{
int n=0;
for(int k=0;k<datalen;k++)
{
if(k!=j)
{
alldata[level+1][n] = alldata[level][k];
n++;
}
}
output[0] = alldata[level][j];
Combination(level+1,datalen-1,output + 1);
}
}else
{
output[0] = alldata[level][0];
// 一次排列完成,插入处理函数
}
}
2 组合历遍(递归法)
C++版本
使用
//inputdata需要初始化为组合所包括的元素,调用时需要指明所有元素个数(对于函数来说是可选的元素个数),单个组合包含的元素个数(对于函数来说是单次排列缺少的元素个数)
Permutation(inputdata,6,outputdata,3);
代码Permutation(inputdata,6,outputdata,3);
void Permutation(int *data, int datalen, int * output, int num)
{
for(int i=0;i<datalen-num+1;i++)
{
*output = data[i];
if(num >1)
Permutation(data+1+i,datalen-1-i,output+1,num-1);
else
{
// 一次组合完成,插入处理函数(如果需要中途退出,可以将函数返回值改为bool型)
}
}
}
dephi版本{
for(int i=0;i<datalen-num+1;i++)
{
*output = data[i];
if(num >1)
Permutation(data+1+i,datalen-1-i,output+1,num-1);
else
{
// 一次组合完成,插入处理函数(如果需要中途退出,可以将函数返回值改为bool型)
}
}
}
使用
var
inputdata :array of Real;
outputdata : array of Real;
i : integer;
begin
SetLength(inputdata,5);
SetLength(outputdata,3);
for i := 0 to 5 do
inputdata[i] := i;
Permutation(inputdata,0,outputdata,0);
end;
代码inputdata :array of Real;
outputdata : array of Real;
i : integer;
begin
SetLength(inputdata,5);
SetLength(outputdata,3);
for i := 0 to 5 do
inputdata[i] := i;
Permutation(inputdata,0,outputdata,0);
end;
procedure Permutation(var inputdata: array of Real;inputpos:integer;var outputdata:array of Real;outputpos:integer);
var
I: Integer;
begin
for I := 0 to High(inputdata) - inputpos - High(outputdata) + outputpos do
begin
outputdata[outputpos] := inputdata[inputpos+i];
if(outputpos < High(outputdata) )then
Permutation(inputdata,inputpos+1+I,outputdata,outputpos+1)
else
cb(outputdata);//处理函数
end;
end;
var
I: Integer;
begin
for I := 0 to High(inputdata) - inputpos - High(outputdata) + outputpos do
begin
outputdata[outputpos] := inputdata[inputpos+i];
if(outputpos < High(outputdata) )then
Permutation(inputdata,inputpos+1+I,outputdata,outputpos+1)
else
cb(outputdata);//处理函数
end;
end;