好玩的递归:(
递归其实一点也不好玩:(
这个递归函数会引起“无效命令”错误,但我实在看不出哪里出错了,请你帮我检查一下好吗?
函数功能:给出一个参数结点find_node,搜索可以到达全局结点end_node的路径,将该路径存储在Beads_road[50][2]二维数组中.(一维就够了,但在程序其他地方需要用到第二维数据)
数据结构:共有9*9个方块。
Beads_checked[9][9],值为1时表示由此方块递归,无法到达全局结点end_node.为0时表示由此方块递归,可以到达全局结点end_node.开始时,Beads_checked[9][9]={0}
Beads_road[50][2],存放搜索到的路径值,例如第2行8列的方块,将其转变为一个整数:num=2*9+8%9,最后由a=num/9,b=num%9,b=b?b:9;还原行列值。
int Beads_get_road(Beads_node find_node)
{
int i,j,flag=0,find_num=0;
Beads_node node;
int x,y;
int aa[]={-1,1,0,0};
int bb[]={0,0,-1,1};
for(i=0;i<4;i++)
{
node.a=find_node.a+aa[i];
node.b=find_node.b+bb[i];
if (!(node.a>0&&node.a<10&&node.b>0&&node.b<10))
continue;
if( (!Beads_Beads[node.a][node.b]) && (!Beads_checked[node.a][node.b]) )
{
if(node.a==end_node.a && node.b==end_node.b)
{
j=0;
while(Beads_road[j][0]!=0)
j++;
Beads_road[j][0]=find_node.a*9+find_node.b%9;
return 1;
}
else if( Beads_get_road(node) )
{
find_num++;
return 1;
}
}
}
if(find_num>0)
{
Beads_checked[find_node.a][find_node.b]=0;
j=0;
while(Beads_road[j][0]!=0)
j++;
Beads_road[j][0]=find_node.a*9+find_node.b%9;
return 1;
}
else
{
Beads_checked[find_node.a][find_node.b]=1;
return 0;
}
}
问题点数:50、回复次数:16Top
1 楼FireEmissary(咒火使者)回复于 2005-05-03 11:37:04 得分 5
是递归太深,栈空间不足Top
2 楼SaiRose(Learning......)回复于 2005-05-03 11:44:30 得分 20
if (!(node.a>0&&node.a<10&&node.b>0&&node.b<10))??
if (!( node.a>=0 &&node.a<10&& node.b>=0 &&node.b<10))
if(find_num>0)
{
Beads_checked[find_node.a][find_node.b]=1; // 已经走过的
j=0;
while(Beads_road[j][0]!=0)
j++;
Beads_road[j][0]=find_node.a*9+find_node.b%9;
return 1;
}
else
{
Beads_checked[find_node.a][find_node.b]=0; //
return 0;
}
另;把全部代码帖出来好了,一个函数好难看...还不能调试,也不知道对不对
Top
3 楼cpponduty(饼子村村支书)(出入平安,攻德无量,万受无疆)回复于 2005-05-03 11:56:42 得分 5
也许的确是递归太深,栈空间不足,导致ret到非法地址去。。Top
4 楼copygirl(wa!)回复于 2005-05-03 11:59:08 得分 0
SaiRose(Learning......)
-------------------------------
if (!(node.a>0&&node.a<10&&node.b>0&&node.b<10))
这个是边界检查,看看是否在1-9之间,因为它只是个9*9的格子.我把值定为1-9,只是为了调试方便而已,用0-8也是可以的.
我一开始将Beads_checked[][]定义为:已经检查过的格子,现在把它定义为:走不通的格子.
这段程序确实有点长,但我已经把搜索最优路径的那段去掉了,已经不能再去了:(Top
5 楼SaiRose(Learning......)回复于 2005-05-03 12:46:37 得分 0
我不觉得是因为递归的太深,就是一个迷宫吧,才9*9
再大也大不到哪去,我最近做的一个40*40*40的递归都可以
楼主的问题是什么?
什么叫“无效命令”错误?
不清楚,还望指教Top
6 楼copygirl(wa!)回复于 2005-05-03 12:48:56 得分 0
哦,它运行着运行着,就会自动关闭,然后出现一个对话框,里面有“无效命令”错误什么的.Top
7 楼SaiRose(Learning......)回复于 2005-05-03 12:59:12 得分 0
那可能是数组越界,访问非法内存什么的
单步调试看看
把代码给我,我帮你看Top
8 楼SaiRose(Learning......)回复于 2005-05-03 13:43:26 得分 0
不是太明白楼主的意思
Beads_checked我觉得可以用来标记已经走过的点
用回搠实现
看楼主的程序感觉是个死循环,因为可以访问以前走过的点Top
9 楼blackmouth(黑嘴)回复于 2005-05-03 14:58:42 得分 0
用递归虽然是很美妙的事情,但是有递归深度的限制,导致程序虽然在逻辑上完全正确,但是由于递归太深,程序会无故退出,而且毫无错误提示,我曾经编过一个字符处理程序就是这样,查了半天的错,最后把程序改成非递归的就没错了。所以还是慎用递归!!
根据楼主的描述,问题不是出在递归深度限制上。Top
10 楼copygirl(wa!)回复于 2005-05-04 19:18:12 得分 0
我发现最近怎么老是散分,这个贴又是散分贴,晕!
已经检查出错误了,全部代码只有大概十来行的样子,写的时候糊涂了,我怎么这样呢。。。。。。
后天上班的时候再散源代码,敬请期待(我手机上的“五连珠”游戏)。
浪费了这么多天,原来是开始时的搜索路径写错了,我要疯了Top
11 楼SaiRose(Learning......)回复于 2005-05-04 19:50:28 得分 5
呵呵
那是因为这几天过节Top
12 楼du51(郁郁思扬)回复于 2005-05-04 19:59:25 得分 5
呵呵.有意思.Top
13 楼copygirl(wa!)回复于 2005-05-04 20:21:27 得分 0
可是,不是4.1,我也会自己让自己犯糊涂。。。。。。Top
14 楼SaiRose(Learning......)回复于 2005-05-04 20:28:24 得分 0
难得糊涂...Top
15 楼pahuihui(帕灰灰)回复于 2005-05-04 21:10:48 得分 5
曾几何时,记得大师说过:
递归递归,切莫只递不归Top
16 楼dobear_0922(do熊)回复于 2005-05-05 12:16:18 得分 5
楼上说得好,呵呵Top




