运行环境是PHP。需求是,在一棵无限级树的任何一个节点,生成整个树形结构,并标明该节点所在位置。
用递归是最简单的做法,这里的问题是,Recursion是一个一边运算,一边输出结果的过程,不能像select语句那样一次性输出结果,而AJAX要求后台程序一次性返回一个完整的XML数据单元,两边搭配不起来。
求解,变通的办法也可以接受。
我们已经回来
运行环境是PHP。需求是,在一棵无限级树的任何一个节点,生成整个树形结构,并标明该节点所在位置。
用递归是最简单的做法,这里的问题是,Recursion是一个一边运算,一边输出结果的过程,不能像select语句那样一次性输出结果,而AJAX要求后台程序一次性返回一个完整的XML数据单元,两边搭配不起来。
求解,变通的办法也可以接受。
我不是很明白“一边运算,一边输出结果”的意思。的确递归是个不断运行的过程,但是在运算过程中没有必要直接把结果输出到客户端阿。运算结果放到一个字符串里,在递归结束后输出不就可以了么?
cobalt
2006/07/16 11:00
问题是调用后台递归的时候,没有办法预测什么时候递归会结束,递归过程中产生的中间结果存放在哪里,在结束的时候如何一次性返回给browser?
Datou
2006/07/16 11:45
递归自己会处理“什么时候会结束”的问题啊。
cobalt
2006/07/16 12:05
不能使用全局变量来保存结果吗?
xorms
2006/07/16 13:27
php?试试看output buffering行不行。具体看ob_start()函数的文档。
感觉你好像把事情想复杂了
kraml
2006/07/16 16:02
ob_start会影响全局,动静太大,暂时不考虑
Datou
2006/07/16 22:07
而AJAX要求后台程序一次性返回一个完整的XML数据单元?
恐怕很难吧
鲤鱼
2006/07/16 23:33
"问题是调用后台递归的时候,没有办法预测什么时候递归会结束" ,
这句话比较费解…
理论上来说递归只是算法的内部实现,对于外部调用来说,方法返回的时候就是递归结束的时候了。
对于生成目录树来说,每次递归的结果都是返回一个递归节点的字符串,当递归方法调用结束的时候,最终的返回值应该就是一个完整的字符串了。
如果说你希望用临时空间来保存中间结果,采用临时文件或者数据库的临时表应该都可以吧?
zeal
2006/07/17 12:34
这个问题要放到php环境下面来讲,用c或者其他语言能够做到,这点很清楚,但是php对递归的支持很有限
Datou
2006/07/17 16:19
这个问题撞过:
<?
function Test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test ();
}
}
Test();
?>
输出结果是:12345678910
但要把这个结果存在一个变量里,好象就难了…
didu
2006/07/17 21:38
我觉得这个不是递归的问题,也不是PHP的问题,
而是你的源数据在哪?在 DB 里面还是在文本里面?
但是如果是实时的解决方案,恐怕递归出来,性能吃不消啊。
鲤鱼
2006/07/17 22:42
实时的一次性递归出来一棵无限级的树… (._.!)
如果访问量上去的话,就麻烦了。因为不可比避免的面临一个冲突,人多,那么数据就多,那么你要 Cache 的周期就必须加长,但是人多,Cache 周期长,又不能够很好的满足用户的体验了。。。
鲤鱼
2006/07/17 22:47
理论上无限级,实际上一般三四级,多的七八级。
Datou
2006/07/17 23:08