一个递归转循环的问题

dead_lee 2002-06-06 07:33:26
请教一个关于树的查找问题,理论上来说,好像只要是能用递归的地方,都可以用循环来完成的,现在我发现一个树的搜索问题,用递归可以很容易的完成,但是循环我就想不到有什么好办法了.
具体情况如下,一个树,可能有不定数量的子节点,每个子节点也还可以有子节点,我现在需要搜索出一个指定树下面所有的子节点,对其进行处理,假设节点对象是A,则A.Childs会返回A的所有子节点,用递归的话,可以反复调用函数一直到A.Childs返回nil为止,但是想不出来用循环如何处理.
之所以不用递归,是由于在实际环境里面,树可能深度很大,如果用递归,可能会导致堆栈的溢出,毕竟堆栈是很宝贵的资源.
...全文
335 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dead_lee 2002-06-07
  • 打赏
  • 举报
回复
受教了...我回头自己试试...先结贴吧.
xiaoluoli 2002-06-07
  • 打赏
  • 举报
回复
中序遍历,先序遍历都可以,只要吧VISIT函数改成查找函数吗?
stonesky 2002-06-07
  • 打赏
  • 举报
回复
可以的

C语言描述:
节点:
struct node{
struct node *parent,child,next;
...
}

遍历模型:
while(parent)
{
do sth.
child=parent->child;
while(child)
{
do sth.
if(child->child) {
parent = child;break;//转到下一层
}
child=child->next;
}
if(!child){//parent下遍历完
while(parent && !parent->next){//转到父层
parent=parent->parent;
if(parent==最初的节点) parent=NULL;}//最初节点下所有节点遍历完
if(parent==最初的节点) parent=NULL;
if(parent)
parent=parent->next;
}
if(parent==最初的节点) parent=NULL;
}

而且可以用循环实现查找:
找到一次就返回,再调用继续查找,直到最后返回NULL,查找结束

够了吗?多给些分吧。
starfish 2002-06-06
  • 打赏
  • 举报
回复
如果想要更深入地了解递归
建议你学习一下数理逻辑、递归论、lamda演算,以及计算理论的相关知识。
starfish 2002-06-06
  • 打赏
  • 举报
回复
错!不是所有的递归都可以转化为迭代,一个经典的例子是Ackmann函数,可以证明他不存在迭代算法。事实上只有很少的一类递归才能转化为迭代,最简单的一类是尾递归,直接利用goto语句就可以转化为迭代了。60年代的时候Cooper就仔细研究了这个问题,提出了很多程序等价变换的基本定理,其中关于递归转化迭代的最有名的定理是cook变换,其形式如下:
[Cooper变换]
输入模式:
f(x) ≡ if b(x) then h(x)
else F(f(k(x)), g(x))
输出模式:
f(x) ≡ G(x, e)
G(x, y) ≡ if b(x) then F(h(x), y)
else G( k(x), F(g(x),y) )
其中:
x, k: TYPE1, k(x) -< x ( 符号 -< 表示偏序)
y, G, h, g, f, F: TYPE2
b: boolean
e: F的右单位元,即F(x, e) = x

可用性条件:
(1)F满足结合律,即F(F(x,y),z) = F(x, F(y, z))
(2)F有右单位元e;
(3)b, h, g, k中都不含f

=====================================================

[拓广的Cooper变换]
输入模式:
f(x) ≡ if b(x) then h(x)
else if b1(x) then F1( f( k1(x) ), g1(x) )
...
else if bn(x) then Fn( f( kn(x) ), gn(x) )
else F0( f( k0(x) ), g0(x) )

输出模式:
f(x) ≡ if b(x) then h(x)
else if b1(x) then G1( k1(x), g1(x) )
...
else if bn(x) then Gn( kn(x), gn(x) )
else G0( k0(x), g0(x) )

对于所有的 0≤i≤n,
Gi( x, y) = if b(x) then Fi( h(x), y )
else if b1(x) then Gi( k1(x), F1( g1(x), y ) )
...
else if bn(x) then Gi( kn(x), Fn( gn(x), y ) )
else Gi( k0(x), F0( g0(x), y ) )

其中:
对于所有的 0≤i≤n
x, ki: TYPE1, ki(x) -< x ( 符号-< 表示偏序)
gi, h, Fi, Gi, y: TYPE2
b, bj: boolean, 1≤j≤n
b(x)∧b1(x)∧……∧bn(x) = φ (空集)
b(x)∨b1(x)∨……∨bn(x) = Ω (全集)

可用性条件:
(1)Fi满足结合律,即Fi( Fj(x, y), z ) = Fj( x, Fi(y, z) ), 0≤i, j≤n
(2)b, bj, h, gi, ki中都不含f, 0≤i≤n, 1≤j≤n

=====================================================

[反演变换]
输入模式:
f(x) ≡ if b(x) then h(x) else F( f(k(x)), g(x) )
输出模式:
f(x) ≡ G(x, x0, h(x0))
G(x, y, z) ≡ if y=x then z
else G(x, k'(y), F( z, g(k'(y))) )
可用性条件:
(1)b(x)为真时可求出相应之x值x0;
(2)k(x)存在反函数k'(x);
=====================================================
xiaoluoli 2002-06-06
  • 打赏
  • 举报
回复
用哪个遍历的方法就可以了吗,书上就有吗,你想要我可以给你,给我发帖子
OK!!!!
「已注销」 2002-06-06
  • 打赏
  • 举报
回复
理论上用递归就能用循环来完成?没听说过!不一定所有的递归都可以用循环完成的,想一想汉诺塔就知道了。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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