使用递归算法的的函数的返回值问题!

程晨c 2012-03-29 10:36:46
数据表tablex的结构如下
----------------------------------
id ----------int型(主键)
parentid-----int型
----------------------------------

函数功能,要求传入某个id值,从tablex表中找出所有id的子孙的id组成的字符串,
例如,表数据如下
id-------parentid
1--------null
2--------1
3--------1
4--------2
5--------2
6--------3
7--------4
8--------4
如下图


传入参数2,返回字符串'2,4,5,7,8'



我现在写的函数如下,是通过改变全局变量的值来得到由子孙ID组成的字符串的。

public
strIDs:string;//全局变量

function TForm1.GetAllID(intRootID:integer):string;
var
qyTemp: TADOQuery;
strSql:string;
intID:integer;
strtmp:string;
begin

if strIDs='' then
begin
strIDs:=IntToStr(intRootID);
end
else
begin
strIDs:=strIDs+','+IntToStr(intRootID);
end;

qyTemp := TADOQuery.Create(nil);
qyTemp.Connection := Con1;
strsql:='select id from tablex where parentid='+inttostr(intRootID);
qyTemp.Close;
qyTemp.SQL.Text:=strSql;
qyTemp.Open;
if qyTemp.RecordCount=0 then
begin
strtmp:=''
end
else
begin
qyTemp.First;
while not qyTemp.Eof do
begin
intId:=qyTemp.Fieldbyname('id').AsInteger;
GetAllID(intID);
qyTemp.Next;
end;
end;
Result:=strtmp;
end;


现在的问题是,如何通过函数的返回值得到所有子孙id组成的字符串,而不是通过函数影响全局变量来得到。
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2012-03-30
  • 打赏
  • 举报
回复
学习了,谢谢分享问题
接分中
jonathanscor 2012-03-30
  • 打赏
  • 举报
回复
递归的使用,我一般感觉是把当前找到的节点作为父节点即可,同时在调用递归的地方返回结果比较好
程晨c 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
我的意思是,要是SQL2005可以用1句SQL语句就可以查询出结果
既然解决了,就接分吧
[/Quote]

这样更好,虽然我用的是sql2000,你说下基于sql2005的解决方法。学习一下!
程晨c 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Delphi(Pascal) code
result:=result+','+GetAllID(intID);
[/Quote]

是的,再次修改后的函数如下

function TForm1.GetAllID(intParentID:integer):string;
var
qyTemp: TADOQuery;
strSql:string;
intID:integer;
begin
qyTemp := TADOQuery.Create(nil);
qyTemp.Connection := Con1;
strsql:='select id from tablex where parentid='+inttostr(intParentID);
qyTemp.Close;
qyTemp.SQL.Text:=strSql;
qyTemp.Open;
result:=IntToStr(intParentID);
qyTemp.First;
while not qyTemp.Eof do
begin
intId:=qyTemp.Fieldbyname('id').AsInteger;
result:=result+','+GetAllID(intID);
qyTemp.Next;
end;
end;

kaikai_kk 2012-03-29
  • 打赏
  • 举报
回复
我的意思是,要是SQL2005可以用1句SQL语句就可以查询出结果
既然解决了,就接分吧
程晨c 2012-03-29
  • 打赏
  • 举报
回复
遇到使用递归的时候,思路总是多少有些混乱!
程晨c 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
什么数据库
[/Quote]
跟数据库的类型没有关系。
程晨c 2012-03-29
  • 打赏
  • 举报
回复
问题解决了
修改后的函数如下

function TForm1.GetAllID(intParentID:integer):string;
var
qyTemp: TADOQuery;
strSql:string;
intID:integer;
strtmp:string;
begin
qyTemp := TADOQuery.Create(nil);
qyTemp.Connection := Con1;
strsql:='select id from tablex where parentid='+inttostr(intParentID);
qyTemp.Close;
qyTemp.SQL.Text:=strSql;
qyTemp.Open;
strtmp:=IntToStr(intParentID);
qyTemp.First;
while not qyTemp.Eof do
begin
intId:=qyTemp.Fieldbyname('id').AsInteger;
strtmp:=strtmp+','+GetAllID(intID);
qyTemp.Next;
end;
result:=strtmp;
end;
kaikai_kk 2012-03-29
  • 打赏
  • 举报
回复
什么数据库
程晨c 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
Delphi(Pascal) code
result:=result+','+GetAllID(intID);
[/Quote]

测试过了,这样得到的结果是错误的!
haitao 2012-03-29
  • 打赏
  • 举报
回复
result:=result+','+GetAllID(intID);

16,748

社区成员

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

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