怎么将该递归算法改为非递归或者用栈来实现
如何将该递归算法改为非递归或者用栈来实现?
void TravelItem(HTREEITEM hStart)
{
if(hStart == NULL)
return;
if(isItemExpanded(hStart) ) //该节点是否展开
{
hStart = tree.GetChildItem(hStart); //获取子节点
while(hStart)
{
TravelItem(hStart);
hStart= GetNextSiblingItem(hStart); //获取兄弟节点
}
else
{
hStart = GetNextSiblingItem(hStart);
TravelItem(hStart);
}
}
------解决思路----------------------
将递归改为非递归不是很简单嘛? 创建一个堆栈容器,第一次调用的参数push进堆栈,递归代码外层加一个do...while()循环,判断条件就是堆栈是否为空。递归代码中的return改成pop(); continue; 递归调用的地方改成push(); continue;就行了。这么简单自己写就行了。
------解决思路----------------------
楼上的说法是对的,递归的本质就是栈,是将函数的参数以及函数的返回地址压入了栈。如果你自己建一个参数栈的话,可以省掉将函数的返回地址压入栈的开销,其他没有什么好处,你做的不会比系统本身做的更好。
void TravelItem(HTREEITEM hStart)
{
if(hStart == NULL)
return;
if(isItemExpanded(hStart) ) //该节点是否展开
{
hStart = tree.GetChildItem(hStart); //获取子节点
while(hStart)
{
TravelItem(hStart);
hStart= GetNextSiblingItem(hStart); //获取兄弟节点
}
else
{
hStart = GetNextSiblingItem(hStart);
TravelItem(hStart);
}
}
------解决思路----------------------
将递归改为非递归不是很简单嘛? 创建一个堆栈容器,第一次调用的参数push进堆栈,递归代码外层加一个do...while()循环,判断条件就是堆栈是否为空。递归代码中的return改成pop(); continue; 递归调用的地方改成push(); continue;就行了。这么简单自己写就行了。
------解决思路----------------------
楼上的说法是对的,递归的本质就是栈,是将函数的参数以及函数的返回地址压入了栈。如果你自己建一个参数栈的话,可以省掉将函数的返回地址压入栈的开销,其他没有什么好处,你做的不会比系统本身做的更好。