gpt4 book ai didi

c++ - 如何避免深树递归中的堆栈溢出

转载 作者:行者123 更新时间:2023-11-30 04:34:41 24 4
gpt4 key购买 nike

我已经阅读了很多类似的文章,如果已经回答了这个问题,我深表歉意,但我还是卡住了。

我正在编写一个函数来填充一棵树,每个节点有四个分支,这将存储“八 block 拼图”的可能状态操作,即 http://www.8puzzle.com/images/8_puzzle_start_state_a.png

问题是,由于手头问题的高度递归性质,我认为是堆栈溢出。

尾递归似乎是解决方案,但我不确定它是否相关/可能或如何在这种情况下实现它。代码如下:

void Tree::insert(string &initialState, const string &goalState, tree_node *&inNode){
cout<<"insert called"<<endl;
depth++;
cout<<depth<<endl;
string modState;
int zeroPos=0;

if(initialState==goalState){
cout<<"* * * GOAL * * *"<<endl;
getchar();
exit(0);
}

if(inNode==NULL){//is this the first node?

inNode = new tree_node(initialState);
root=inNode;
inNode->parent=NULL;
insert(initialState, goalState, inNode);
}else{
inNode->state = initialState;

for(zeroPos=0;zeroPos<initialState.size();zeroPos++){//where is the empty tile?
if(initialState[zeroPos]=='0'){
break;
}
}
//left
if(zeroPos!=0 && zeroPos!=3 && zeroPos!=6){//can the empty tile move left?

modState=initialState;
modState[zeroPos]=modState[zeroPos-1];
modState[zeroPos-1]='0';

if(isOriginal(modState, inNode) ){//does this state already exist?

cout <<"left " << modState[0]<<modState[1]<<modState[2]<<endl;
cout <<"left " << modState[3]<<modState[4]<<modState[5]<<endl;
cout <<"left " << modState[6]<<modState[7]<<modState[8]<<endl;

inNode->l = new tree_node(modState);
inNode->l->parent= inNode;
if(inNode->l != NULL){
insert(modState, goalState, inNode->l);
}
}
}

}
}
}

最佳答案

这是一个非常通用的答案,但是您是否尝试过通过堆分配队列或堆栈之类的方式显式管理您的堆栈?基本上不使用实际的函数调用,只是从你自己的堆栈/队列中推拉东西。它们涵盖非递归图遍历算法 here (深度优先和广度优先搜索)。

关于c++ - 如何避免深树递归中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com