delphi的递归调用是不是要注意什么?

space118151509 2012-03-05 02:57:21
procedure Tform1.Filelist(path:string);
var
searchRec:TsearchRec;
Fcount:integer;
begin

if not (rightstr(trim(path),1)='\')then
path:=path+'\';
Fcount:=FindFirst(path+'*.*',faAnyFile,SearchRec); { }
while(Fcount)=0 do

begin
if (SearchRec.Attr=16)and (SearchRec.Name<>'.')and (SearchRec.Name<>'..')then
begin

filelist(path+SearchRec.Name);

end
else
begin
listbox1.Items.Add(SearchRec.Name);
Fcount:=FindNext(SearchRec);
end;
end;

findclose(SearchRec);

end;


怎么我就跳不出这个循环呢,当把filelist(path+SearchRec.Name);给屏蔽了换成别的就可以,不然当然Fcount不等于0跳出来后又会跑回去,真是搞不懂,求指点!
...全文
225 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
space118151509 2012-03-05
  • 打赏
  • 举报
回复
可以了 妈的 完全不知道怎么回事的 我一定是晕过头了 谢谢楼上两位了了
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
251450368
space118151509 2012-03-05
  • 打赏
  • 举报
回复
那没理由啊··我复制粘贴的啊···还是死···你qq多少···内线我吧···帮我远程下汗··
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
程序没有死,,
space118151509 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 case5166 的回复:]

Delphi(Pascal) code
procedure Tform1.Filelist(path:string);
var
searchRec:TsearchRec;
Fcount:integer;
begin
if not (rightstr(trim(path),1)='\')then
path:=path+'\';
Fcount:=FindFirst(path+'*……
[/Quote]

是不行啊,复制粘贴运气不行,你可以?
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
procedure Tform1.Filelist(path:string);
var
searchRec:TsearchRec;
Fcount:integer;
begin
if not (rightstr(trim(path),1)='\')then
path:=path+'\';
Fcount:=FindFirst(path+'*.*',faAnyFile,SearchRec); { }
while(Fcount)=0 do
begin
if (SearchRec.Attr=16)and (SearchRec.Name<>'.')and (SearchRec.Name<>'..')then
filelist(path+SearchRec.Name)
else
listbox1.Items.Add(SearchRec.Name);
Fcount:=FindNext(SearchRec);
end;
findclose(SearchRec);
end;
Lz写代码注意缩进吧,,看不出代码的层次
kaikai_kk 2012-03-05
  • 打赏
  • 举报
回复
确定试了???这样看的清楚些

while(Fcount)=0 do
begin
if (SearchRec.Attr=16)and (SearchRec.Name<>'.')and (SearchRec.Name<>'..')then
filelist(path+SearchRec.Name)
else
listbox1.Items.Add(SearchRec.Name);

Fcount:=FindNext(SearchRec);
end;
space118151509 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 case5166 的回复:]

kaikai_kk
的眼睛太利锐了,
[/Quote]
不行啊,还是死在那里
space118151509 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kaikai_kk 的回复:]

begin
listbox1.Items.Add(SearchRec.Name);
Fcount:=FindNext(SearchRec);
end;

===>>>

begin
listbox1.Items.Add(SearchRec.Name);

end;
Fcount:=FindNext(SearchRec);
[/Quote]

这个一样的,试了
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
kaikai_kk
的眼睛太利锐了,
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
试了下,你的
if (SearchRec.Attr=16)and (SearchRec.Name<>'.')and (SearchRec.Name<>'..')then
begin
ShowMessage(path+SearchRec.Name);//多次出现上级目录
filelist(path+SearchRec.Name);

end
这个还能找到config这个目录,一直在这里死了
kaikai_kk 2012-03-05
  • 打赏
  • 举报
回复
begin
listbox1.Items.Add(SearchRec.Name);
Fcount:=FindNext(SearchRec);
end;

===>>>

begin
listbox1.Items.Add(SearchRec.Name);
end;
Fcount:=FindNext(SearchRec);
space118151509 2012-03-05
  • 打赏
  • 举报
回复
结束条件?不就是while(Fcount)=0 do ,当fcount不等于0的时候就结束不是结束条件吗?
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
递归必须有终点,所以必需注意程序的结束条件
//filelist(path+SearchRec.Name);除了这句话后那就不是递归调用了哦,所以当然没问题,你这样会导致循环没有终点
procedure Tform1.Filelist(path:string);
var
searchRec:TsearchRec;
Fcount:integer;
begin

后面加上退出条件

16,743

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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