请问这种代码该怎么转化成递归写法 ( 积分: 20 )

  • 主题发起人 主题发起人 loskiller
  • 开始时间 开始时间
L

loskiller

Unregistered / Unconfirmed
GUEST, unregistred user!
for i:=0 to x.count-1 do
begin
x.x.dosomething;
for j:=0 to x.x.count-1 do
begin
x.x.x[j].dosomething;
for k:=0 to x.x.x[j].count-1 do
begin
x.x.x[j].x[k].dosomething;
end;
end;
end;
其中x,x,x[j],x[k]都是Tx类型的变量,我应该怎么控制for语句的次数
 
for i:=0 to x.count-1 do
begin
x.x.dosomething;
for j:=0 to x.x.count-1 do
begin
x.x.x[j].dosomething;
for k:=0 to x.x.x[j].count-1 do
begin
x.x.x[j].x[k].dosomething;
end;
end;
end;
其中x,x,x[j],x[k]都是Tx类型的变量,我应该怎么控制for语句的次数
 
不用写成递归,
一般来说循环比递归快。
 
当年一分析递归就有走火入魔之感,今天看了这个又找到了当年的感觉!唉..帮你顶吧!
 
可以帮你改成递归的,不过我不清楚你那个TX是什么类型..我菜着呢...
大概看了一下,想问请一下,TX类型是不是有可以判断他自己有没有下一层的属性?有就可以改,没有好像就不行了 (比如说x 的下一层是x.x[?] 再下一层是 x.x[?].x[?]
procedure TxDosomething(x:TX);
var
Num:Integer;
begin
For Num:=0 to x.count-1 do
begin
x.x[Num].dosomething;
if x.x[Num].Count<>0 then //如果自身下一层还有东东,就递归调用
xDosomething( x.x[Num])

end;
end;

调用:xDosomething( x );

这样就应该差不多了吧,就是判断参数的下一层有没有 东东,有就调用那个DoSomeThing函数,没有就算,递归这东西就是自己调用自己,在未知,或不可预见的情况下才用,因为它占内在太多,每一层占用一些内存
yygymjgw32167@163.com qq:32876596
 
可以用x.x[Num].Count<>0判断是否还有东西
但是我想控制for的层数,比如这次我只想访问到第三层,下次想访问到第四层
 
procedure TxDosomething(x:TX
nLevel : integer);
var
Num:Integer;
begin
if nLevel<=3 then
For Num:=0 to x.count-1 do begin
x.x[Num].dosomething;
if x.x[Num].Count<>0 then
xDosomething(x.x[Num], nLevel+1)

end;
end;

调用:TxDosomething(x,1);

^o^
 
我想我写的应该和 风卷残月 的差不多
不过painboy有可能符合你的要求。
 
procedure TxDosomething(x:TX);
var
Num:Integer;
begin
For Num:=0 to x.count-1 do
begin
if x[Num].Count<>0 then //有下一层
xDosomething( x[Num][son]) // x[num][son]为x[num]的下一层
else //没有下一层
x[Num].dosomething

end;
end;
 
多人接受答案了。
 
后退
顶部