请教:递归程序改成非递归程序 ( 积分: 20 )

  • 主题发起人 主题发起人 guzhengyi_nj
  • 开始时间 开始时间
G

guzhengyi_nj

Unregistered / Unconfirmed
GUEST, unregistred user!
有劳大家帮我看看,怎么改成非递归?
谢谢!

function TForm1.getpath(r1, r2, p1: string):boolean;
var
num,i:integer;
qu:TADOQuery;
p3,sql,temp,p2:string;
begin

qu:=TADOQuery.Create(application);
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
exit;
end
else
begin
p3:=p3+'-'+temp;
qu.Next ;
getpath(temp,r2,p3);
end;
end;
end
else
result:=false;

end;
 
有劳大家帮我看看,怎么改成非递归?
谢谢!

function TForm1.getpath(r1, r2, p1: string):boolean;
var
num,i:integer;
qu:TADOQuery;
p3,sql,temp,p2:string;
begin

qu:=TADOQuery.Create(application);
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
exit;
end
else
begin
p3:=p3+'-'+temp;
qu.Next ;
getpath(temp,r2,p3);
end;
end;
end
else
result:=false;

end;
 
楼主这个程序应该是求路由的,要改成非递归,不是很简单吗,还是我理解错误
function TForm1.getpath(r1, r2, p1: string):boolean;
var
num,i:integer;
qu:TADOQuery;
p3,sql,temp,p2:string;
flag:boolean;
begin
flag:=false;
qu:=TADOQuery.Create(application);
repeat
qu.Close ;
qu.sql.clear;
sql:='select * from AllIPConn where router1='''+r1+'''';
qu.SQL.Add(sql);
qu.Connection:=ADOConnection2;
qu.open;
num:=qu.RecordCount ;
if num>0 then
begin
for i := 0 to num-1 do
begin
p3:=p1;
temp:=qu.FieldByName('router2').AsString ;
if trim(temp)=r2 then
begin
result:=true;
flag:=true;
exit;
end;
p3:=p3+'-'+temp;
break;
end;
end
else
result:=false;
until (flag=true)
end;
 
对,是求路由的,您的改法好像不对。
 
改用存储过程,楼上的兄弟好像没改什么

另外一个提高效率的办法是:
因为程序里面只用到了两个字段router1和router2,那么就把数据库这两个字段内容一次性分别存到两个TStringList里面,然后再去遍历,比用多次取数据库这么折腾要快一些吧
 
后退
顶部