递归算法问题?(50分)

  • 主题发起人 主题发起人 一剑飘雪
  • 开始时间 开始时间

一剑飘雪

Unregistered / Unconfirmed
GUEST, unregistred user!
我给出三个字符串: abc

怎样知道他的全部排制方式, 比如:

a, b, c, aa, ab, ac, ba, bb, bc, ca.....

等,请高手指点!谢谢!
 
这道题不一定要用递归
我记得不错的话,在高级程序员的下午试题里有和一样的题目(两种解法)
去找找 93-99 年之间的
 
我要是能找到就不用烦各位高手了,嘻。。。。。
 
太简单了,给我 200 分我写个给你
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
strData: string = 'ABC';
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
procedure mydo(v: string);
var
i, j: integer;
begin

end;
begin

end;

procedure TForm1.Button2Click(Sender: TObject);
var
i, j, m: integer;
begin

Memo2.Clear;

for i := 1 to 3 do
memo2.Lines.Add(strData);

for i := 1 to 3 do
for j := 1 to 3 do
memo2.Lines.Add(strData + strData[j]);

for i := 1 to 3 do
for j := 1 to 3 do
for m := 1 to 3 do
memo2.Lines.Add(strData + strData[j] + strData[m])

end;

end.

 
顶!!!!!!!!!!!!!!!
 
A
B
C
AA
AB
AC
BA
BB
BC
CA
CB
CC
AAA
AAB
AAC
ABA
ABB
ABC
ACA
ACB
ACC
BAA
BAB
BAC
BBA
BBB
BBC
BCA
BCB
BCC
CAA
CAB
CAC
CBA
CBB
CBC
CCA
CCB
CCC
 
一剑飘雪:你的问题不太清楚。字符排列的最长长度为多少?我暂时假设为4个。其他长度的排列可以依此类推。最长长度为3的排列有3^1+3^2+3^3+3^4=120个。
这个问题不用递归,一个简单的办法就是“数字模拟法”:
abc 分别对应 012,所以任何一个排列可看成一个三进制数。只要对一个循环(从0到3^n-1,n表示排列的长度)就能排出所有该长度的排列。
十进制转换为三进制用除3取余的方法,具体细节可参考数制方面的书。
在长度为3时,25(10进制)=221(3进制)=》ccb
在长度为4时,25(10进制)=0221(3进制)=》accb
具体Delphi程序如下:
//在新窗体中加入一个“button1”控件和一个“ListBox1”控件。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,m,ii:Integer;
s:String;
const
n=4;
begin
for m:=1 to n do //m byte
begin
for i:=0 to round(power(3,m))-1 do
begin
j:=i;
s:='';
for ii:=1 to m do
begin
k:=j mod 3;
j:=j div 3;
case k of
0: s:='a'+s;
1: s:='b'+s;
2: s:='c'+s;
end;
end;
ListBox1.Items.Add(s);
end;
end;
end;

end.


 
无重复情况下:1!+2!+3!+4!+....+n!=
 
书虫王:你的算法很不错,可是你要知道你运算的时间我不敢恭维,你看你能不能写一个快点的,而且能穷举所有排列的字符串。

hfghfghfg:你的算法只能在字符串“abc”当中用,如果我的字符串是 7位数和 100位数的时候,要在你上面加代码,这个时候你可以看看你的代码有多长,嘻。。。。

以上二位朋友我非常谢谢你们,虽然你们写的我用不上。如果你们改写一下就行了。

我的条件是要写一个任意字符串的所有排列方式!
 
//如果正确,就给分吧
//unit
unit umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

const
C_Caption = 'MergeStr';

type
TfrmMergeStr = class(TForm)
btnGetMerge: TButton;
edStr: TEdit;
mmList: TMemo;
procedure btnGetMergeClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
procedure Ms(const str: string);
function push(const s: string): boolean;
function pop(var s: string): boolean;
{ Public declarations }
end;

var
frmMergeStr: TfrmMergeStr;
ol, rs: TStrings;

implementation

{$R *.dfm}

procedure TfrmMergeStr.btnGetMergeClick(Sender: TObject);
var
ist: integer;
begin
if (edstr.Text = '') then exit;
mmList.Clear;
ist := GetTickCount;
Ms(edstr.Text);
mmList.Lines.AddStrings(rs);
Caption := format('%s (%d) time(%d)',
[C_Caption, mmList.Lines.Count, GetTickCount - ist]);
end;

procedure TfrmMergeStr.FormCreate(Sender: TObject);
begin
ol := TStringList.Create;
rs := TStringList.Create;
Caption := C_Caption;
end;

procedure TfrmMergeStr.FormDestroy(Sender: TObject);
begin
FreeAndNil(ol);
FreeAndNil(rs);
end;

procedure TfrmMergeStr.Ms(const str: string);
var
i, len: integer;
s: string;
begin
len := length(str);

for i := 1 to Len do begin
push(str);
end;

while (pop(s)) do
begin
//mmList.Lines.Add(s);
Application.ProcessMessages;
rs.Add(s);
if (Length(s) < len) then
begin
for i := 1 to len do
begin
push(format('%s%s', [s, str]));
end;
end;
end;
end;

function TfrmMergeStr.pop(var s: string): boolean;
begin
result := ol.Count > 0;
if result then
begin
s := ol[0];
ol.Delete(0);
end;
end;

function TfrmMergeStr.push(const s: string): boolean;
begin
ol.Insert(0, s);
result := true;
end;

end.



//dfm
object frmMergeStr: TfrmMergeStr
Left = 192
Top = 133
Width = 378
Height = 340
Caption = 'MergeStr'
Color = clBtnFace
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Scaled = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 14
object btnGetMerge: TButton
Left = 32
Top = 48
Width = 75
Height = 25
Caption = 'GetMerge'
TabOrder = 1
OnClick = btnGetMergeClick
end
object edStr: TEdit
Left = 32
Top = 16
Width = 121
Height = 22
TabOrder = 0
end
object mmList: TMemo
Left = 184
Top = 16
Width = 169
Height = 281
ScrollBars = ssVertical
TabOrder = 2
end
end
 
if (edstr.Text = '') then exit;
mmList.Clear;
rs.Clear
/////////////////
ist := GetTickCount;
Ms(edstr.Text);
mmList.Lines.AddStrings(rs);
 
调试完毕
很简单
用深度优先 呵呵就搞定了
应该符合你的要求

一个窗体
一个edit1
一个button1
把下面的code 粘到 button1里。



procedure TForm1.Button1Click(Sender: TObject);
var s:string;
i:integer;
procedure print_result;
begin
showmessage(s);
end;

procedure dfs(step,k:integer);
var s_bak:string;
i:integer;
begin
if (step>k) then
begin
print_result;
exit;
end;

for i:=1 to length(edit1.Text) do
begin
s_bak:=s;
s:=s+edit1.Text;
dfs(step+1,k);
s:=s_bak;
end;
end;


begin
for i:=1 to length(edit1.text) do
begin
s:='';
dfs(1,i);
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,k:integer;
s1,s2,s3:string;
arr1:array[0..2] of string;
begin
arr1[0]:='a';
arr1[1]:='b';
arr1[2]:='c';
for i:=0 to 2 do
begin
s1:=arr1;
for j:=0 to 2 do
begin
s2:=s1+arr1[j];
for k:=0 to 2 do
begin
s3:=s2+arr1[k];
label1.Caption:=label1.Caption+s3+' ';
end;
label2.Caption:=label2.Caption+s2+' ';
end;
label3.Caption:=label3.Caption+s1+' ';

end;
end;
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部