如何实现一个数组所有的组合????

eniuren 2009-02-05 08:11:12
比如一个数组(1,2,3),如何实现所有的排列组合,如下所示:
(1)
(2)
(3)
(1,2)
(1,3)
(2,3)
(1,2,3)
...全文
513 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jadeluo 2009-02-06
  • 打赏
  • 举报
回复
一个回溯算法的例子:

procedure TForm1.Calc(M : array of Integer);
var
N : Integer;
A : array of Integer;
i , p: Integer;
X : Integer;
S : String;
begin
N := Length(M);
SetLength(A, N);
for X := 0 to N - 1 do
begin
for i := 0 to N - 1 do A[i] := -1;
p := 0;
while p >= 0 do
begin
if A[p] = -1 then
begin
if p = 0 then
A[p] := 0
else
A[p] := A[p - 1] + 1;
end
else
inc(A[p]);
if A[p] >= N then
begin
A[p] := -1;
dec(p);
end
else begin
inc (p);
if p > X then
begin
S := '';
for i := 0 to X do
begin
if s <> '' then s := S + ',';
S := S + IntToStr(M[A[i]]);
end;
memo1.Lines.Add(S);
dec(p);
end;
end;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
M : array [0..3] of Integer = (1, 2, 3, 4);
begin
Calc(M);
end;
liangpei2008 2009-02-06
  • 打赏
  • 举报
回复
lihuasoft 的方法很好很强大!
mandarin 2009-02-06
  • 打赏
  • 举报
回复
学习
genispan 2009-02-06
  • 打赏
  • 举报
回复
好贴 MARK一下
lihuasoft 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Seamour 的回复:]
1楼方法挺不错的,极限是长度32的数组,用 if Boolean((I shr J)and 1) then 更好懂一些。。。
[/Quote]

谢谢, 赞同您所说.

32个数组元素共有4294967295种组合, 即2^32-1 , 已经到达32位机的极限

您那个位右移后判断的写法很好
Seamour 2009-02-05
  • 打赏
  • 举报
回复
1楼方法挺不错的,极限是长度32的数组,用 if Boolean((I shr J)and 1) then 更好懂一些。。。
lihuasoft 2009-02-05
  • 打赏
  • 举报
回复

说一下一楼算法的思路,以免楼主看不懂(这个算法不是递归算法):

首先,把数组每一个元素用一个二进位表示,例如:

A B C D E
1 1 1 1 1 ---> 于是它最多有11111(二进制)种不重复组合(即31种)(不考虑顺序--按楼主要求)

于是,只要检查从1到31这些数字的二进位哪些是二进制值1,就可以得出组合了。(位值为1的元素选取,位值为0的元素弃之)

函数TestBit是我以前写的一个小函数,用于检查某整型数某二进位值,如果该位为1返回True。这个函数从来没有用到过,用在这里了。

^_^

五维思考 2009-02-05
  • 打赏
  • 举报
回复
递归
lihuasoft 2009-02-05
  • 打赏
  • 举报
回复

function TestBit(Value, Index : integer) : Boolean;
asm
BT EAX, EDX
SBB EAX, EAX
AND EAX, 1
end;

procedure TForm1.Button1Click(Sender: TObject);
const
A : array[0..4] of Char = ('A','B','C','D','E');
var
I, J: Integer;
Temp: string;
begin
for I := 1 to 31 do begin
Temp := '';
for J := Low(A) to High(A) do
if TestBit(I, J) then Temp := Temp + A[J];
Memo1.Lines.Add(Temp);
end;
end;


测试结果:

A
B
AB
C
AC
BC
ABC
D
AD
BD
ABD
CD
ACD
BCD
ABCD
E
AE
BE
ABE
CE
ACE
BCE
ABCE
DE
ADE
BDE
ABDE
CDE
ACDE
BCDE
ABCDE

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧